创建对象
总结各方法的差异点1.引用类型共享问题 (问题出处:原型属性 ;解决:构造函数)
2.对象的识别问题 (问题出处:工厂模式 ;解决 :构造函数)
3.代码重复 (问题出处:单句赋值 ;解决 :字面量、工厂函数,构造函数)
4.性能问题 (问题出处:构造函数中的方法; 解决:原型中定义)
5.污染全局 (问题出处:调动全局的函数;解决:原型)
6.原型切断 (问题出处:字面量重写 ;解决:指定constructor值)
7.封装构造函数和原型 (解决:动态原型)
8.原型禁止改动 (解决:工厂函数/寄生构造函数)
1.基本方法
var o = new Object() ;
o.name = "chi";
o.sayName = function(){
alert(o.name );
}
o.name = "chi";
o.sayName = function(){
alert(o.name );
}
缺点:创建多个对象时,大量代码重复
2. 工厂函数
function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
优点:解决代码重复
缺点:没有解决对象识别问题
3.构造函数
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
优点:解决了对象识别问题
缺点:不同实例上的方法是不相等的,是不同的函数对象 ,浪费内存
构造函数改进
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = sayName;
}
alert(this.name);
}
优点:解决不同实例上的同名函数是不相等的问题
缺点:污染全局环境,不能封装
4.原型模式
function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
person1.sayName();
优点:解决全局污染问题,可以封装
缺点:书写麻烦
原型方法改进
function Person(){
}
}
Person.prototype = {
constructor : Person, // 由于重写了原型对象, 需要设置constructor的指向
name : "Nicholas",
age : 29,
job: "Software Engineer",
sayName : function () {
alert(this.name);
}
age : 29,
job: "Software Engineer",
sayName : function () {
alert(this.name);
}
};
优点:减少Person.prototype的输入,
缺点:当原型属性的值为引用类型,无法通过建立同名属性屏蔽原型属性
5.组合使用构造函数模式和原型模式(推荐)
function Person(name, age, job){
this.name = name;this.age = age;this.job = job;
this.friends = ["Shelby", "Court"];
}
Person.prototype = {
constructor : Person,//由于重写了原型对象,将constructor指回PersonsayName : function(){alert(this.name);}
}
优点:1.可以给构造函数传参数(实例化上比较灵活)
2.拥有自己的实例属性,有共享着原型的方法,最大限度地节省了内存
3.解决实例共享原型的引用类型属性(在构造函数中定义属性)
缺点:在不扩展原生构造函数(或希望被修改的构造函数)的情况下,不适合
6.动态原型模式
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);};
}
}
优点:将原型和构造函数封装在一起,仅需在第一次调用时初始化原型
7. 寄生构造函数模式
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("Nicholas", 29, "Software Engineer");
特点:除了创建实例时多了个new ,本质上和工厂函数一样,return 内部实例的引用
优点:在不扩展原生构造函数的情况下自定义一个扩展型的构造函数。
缺点:构造函数和实例间没有联系
8.稳妥构造函数模式
function Person(name, age, job){
var o = new Object();var adress = "北京"; //私有变量
o.sayName = function(){
alert(this.name);
};
return o;
}
var friend = Person("Nicholas", 29, "Software Engineer");
特点:类似工厂模式
优点 : 稳妥构造函数模式没有公共属性,只有私有属性,公有方法,不使用this,new,安全性高 如:参数name为私 有变量,只有sayName方法能访问,比工厂模式更安全
缺点:构造函数和实例间没有联系
构造函数和工厂函数的区别
构造函数模式:1.没有显式地创建对象,(工厂模式:var o = new object)直接将方法和属性付给了this对象;
2. 没有return语句,在工厂模式中 由于显式创建对象 所以必须使用return;
3. 构造函数的实例对象识别性好 例如 instanceof()

浙公网安备 33010602011771号