js创建对象

工厂模式:使用简单的函数创建对象,为对象添加属性和方法,然后返回对象。被构造函数模式所替代
构造函数模式:可以创建自动义引用类型,可以像创建内置对象实例一样使用new操作符,缺点,即它的每个成员都无法得到复用,包括函数
原型模式:使用构造函数的prototype属性来指定那些应该共享的属性和方法。组合使用构造函数模式和原型模式时,使用构造函数定义实例属性,而使用原型模式定义共享的属性和方法。

一、工厂模式
Ps:没有解决对象识别问题(即怎样知道一个对象的类型)

function creatPerson(name,age,job) {
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function() {
alert(this.name);
};
return o;
}

var person1 = creatPerson("ben",12,"soft");
var person2 = creatPerson("lily",13,"doctor");

二、构造函数模式
Ps:和工厂模式有哪些不同:
1)没有显性的创造对象;
2)直接将属性和方法赋给了this对象;
3)没有return语句
缺点:每个方法都要在每个实例上创建一遍。

function Person(name,age,job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() {
alert(this.name);
};
}

var person1 = new Person("ben",12,"soft");
var person2 = new Person("lily",13,"doctor");

三、原型模式
1)每个原型模式都有一个prototyp(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
2)好处:可以让所有对象实例共享它所包含的属性和方法;换句话说,不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中。

function Person() {
}
Person.prototype.name = "ben";
Person.prototype.age = 12;
Person.prototype.job = "soft";
Person.prototype.sayName = function () {
alert(this.name);
};

var person1 = new Person();
person1.sayName();//ben

var person2 = new Person();
person2.sayName();//ben

alert(person1.sayName() == person2.sayName());//true

2、更简单的原型语法

function Person() {
}
Person.prototype = {
constructor : Person,
name : "ben",
age :12,
job :"soft",
sayName : function () {
alert(this.name);
},
};

3)理解原型对象


三、组合使用构造函模式和原型模式(最常用的方式)
构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性
优点:每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度的节省了内存。

function Person(name,age,job) {
this.name = name;
this.age = age;
this.job = job;
this.friends = ["biya","bob"]
}
Person.prototype = {
constructor : Person,
sayName : function() {
alert(this.name);
},
}

var person1 = new Person("ben",12,"soft");
var person2 = new Person("lily",13,"doctor");

person1.friends.push("one");
alert(person1.friends);// biya,bob,ben
alert(person2.friends);//biya,bob
alert(person1.friends === person2.friends);//false
alert(person1.sayName() === person2.sayName());//true

四、动态原型模式
把所有信息都封装在了构造函数中,而通过在构造函数中初始化原型(仅在必要的情况下),又保持了同时使用构造函数和原型的优点 简单的说 可以检查某个应该存在的方法是否有效,来决定是否需要初始化原型。

function Person(name,age,job) {
//属性
this.name = name;
this.age = age;
this.job = job;
//方法
if(typeof this.sayName != "function") {
Person.prototype.sayName = function() {
alert(this.name);
};
}
}

五、寄生构造模式
Ps:前面几种不适用情况下使用
基本思想:创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后在返回新创建的对象

function Person(name,age,job) {
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function() {
alert(this.name);
};
return o;
}

var friend = new Person("ben",12,"soft");
friend.sayName();//ben

六、稳妥构造函数模式
所谓稳妥对象,指的是没有公共属性,而且也不引用this对象,适合在一些安全的环境中(这些环境禁止使用this和new)或者是防止数据被其他应用程序改掉时使用。
1)与寄生构造函数模式有两点不同:一是新创建对象的实例方法不引用this;二是不使用new操作符调用构造函数

function Person(name,age,job) {
//创建要返回的对象
var o = new Object();
//可以在这里定义私有变量和函数

//添加方法
o.sayName = function() {
alert(name);
};

//返回对象
return o ;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值