JavaScript面向对象之对象创建
2017-03-06 16:04
741 查看
1.创建对象:
缺点:创造不同的对象需要大量重复的代码。
2.工厂模式:
缺点:无法判断对象的类型。alert(typeof person1);alert(person1instanceof Object);
3.构造函数模式:
(1)
缺点:sayName方法执行同样的任务,但创建不同的对象时却要不同的Function。
(2)
缺点:(2)虽然解决了(1)的问题,但sayName是一个全局函数,却只能被某个对象使用。如果对象由很多方法,就要定义很多全局函数,破坏了函数的封装性。
4.原型模式:
(1)
缺点:由(2)可以看出原型的缺点,由于共享的特性,在使用基本类型时可以使用隐藏的手段解决,引用类型会造成共享问题。
5.组合构造函数模式和原型模式
function Person(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.friends = ["wangwu","zhaoliu"];
o.sayName = function (){
alert(this.name);
};
return o;
}
var person1 = new Person("zhangsan",20,"teacher");
var person2 = new Person("lisi",30,"doctor");
person1.friends.push("liuqi");
alert(person1.friends);
alert(person2.friends);
alert(person1.friends == person2.friends);
alert(person1.sayName == person2.sayName);8.稳妥构造函数模式:
var person = new Object(); person.name = "zhangsan"; person.age = 30; person.job = "software engineer"; person.sayName = function(){ alert(this.name); } person.sayName();
缺点:创造不同的对象需要大量重复的代码。
2.工厂模式:
function createObject(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 = createObject("zhangsan",20,"teacher"); var person2 = createObject("lisi",30,"doctor"); person1.sayName(); person2.sayName();
缺点:无法判断对象的类型。alert(typeof person1);alert(person1instanceof Object);
3.构造函数模式:
(1)
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = function (){ alert(this.name); }; } var person1 = new Person("zhangsan",20,"teacher"); var person2 = new Person("lisi",30,"doctor"); person1.sayName(); person2.sayName(); alert(person1.sayName == person2.sayName);
缺点:sayName方法执行同样的任务,但创建不同的对象时却要不同的Function。
(2)
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = sayName; } function sayName(){ alert(this.name); } var person1 = new Person("zhangsan",20,"teacher"); var person2 = new Person("lisi",30,"doctor"); person1.sayName(); person2.sayName(); alert(person1.sayName == person2.sayName);
缺点:(2)虽然解决了(1)的问题,但sayName是一个全局函数,却只能被某个对象使用。如果对象由很多方法,就要定义很多全局函数,破坏了函数的封装性。
4.原型模式:
(1)
function Person(){ } Person.prototype.name = "zhangsan"; Person.prototype.age = 30; Person.prototype.job = "teacher"; Person.prototype.sayName = function(){ alert(this.name); }; var person1 = new Person(); person1.sayName(); var person2 = new Person(); person2.sayName(); alert(person1.sayName == person2.sayName);(2)
function Person(){ } Person.prototype = { name:"zhangsan", age:30, job:"teacher", friends:["lisi","wangwu"], sayName:function(){ alert(this.name); } }; var person1 = new Person(); var person2 = new Person(); person1.friends.push("zhaoliu"); alert(person1.friends); alert(person2.friends); alert(person1.friends == person2.friends);
缺点:由(2)可以看出原型的缺点,由于共享的特性,在使用基本类型时可以使用隐藏的手段解决,引用类型会造成共享问题。
5.组合构造函数模式和原型模式
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.friends = ["wangwu","zhaoliu"]; } Person.prototype = { constructor:Person, sayName: function(){ alert(this.name); } }; var person1 = new Person("zhangsan",20,"teacher"); var person2 = new Person("lisi",30,"doctor"); person1.friends.push("liuqi"); alert(person1.friends); alert(person2.friends); alert(person1.friends == person2.friends); alert(person1.sayName == person2.sayName);6.动态原型模式
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.friends = ["wangwu","zhaoliu"]; if(typeof this.sayName != "function"){ Person.prototype.sayName = function (){ alert(this.name); }; } } var person1 = new Person("zhangsan",20,"teacher"); var person2 = new Person("lisi",30,"doctor"); person1.friends.push("liuqi"); alert(person1.friends); alert(person2.friends); alert(person1.friends == person2.friends); alert(person1.sayName == person2.sayName);7.寄生构造函数模式:
function Person(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.friends = ["wangwu","zhaoliu"];
o.sayName = function (){
alert(this.name);
};
return o;
}
var person1 = new Person("zhangsan",20,"teacher");
var person2 = new Person("lisi",30,"doctor");
person1.friends.push("liuqi");
alert(person1.friends);
alert(person2.friends);
alert(person1.friends == person2.friends);
alert(person1.sayName == person2.sayName);8.稳妥构造函数模式:
function Person(name,age,job){ var o = new Object(); o.sayName = function (){ alert(name); }; return o; } var person = Person("zhangsan",20,"teacher"); person.sayName();特点:与寄生构造函数模式相似,不同点在于一是不使用new调用构造函数,二是在创建对象的实例方法中不使用this.
相关文章推荐
- JavaScript高级程序设计之面向对象的程序设计之创建对象之工厂模式第6.2.1讲笔记
- 《JavaScript》——面向对象之对象的创建
- JavaScript [面向对象] 对象创建
- Javascript高级程序设计——面向对象之创建对象
- 详解JavaScript基于面向对象之创建对象(2)
- JavaScript高级程序设计之面向对象的程序设计之创建对象之 构造函数模式第6.2.2讲笔记
- 读javascript高级程序设计05-面向对象之创建对象
- 轻松学习JavaScript十二:JavaScript基于面向对象之创建对象(二)
- 详解JavaScript基于面向对象之创建对象(1)
- JavaScript面向对象(2)——创建对象的工厂模式与构造函数模式
- javascript面向对象应该如何创建对象
- 学习javascript面向对象 掌握创建对象的9种方式
- (13)javascript 面向对象 创建对象
- 面向对象 - javascript创建对象模式总结
- Javascript面向对象之创建对象
- JavaScript高级程序设计【面向对象-创建对象】
- JavaScript高级程序设计【面向对象-创建对象2】
- 从面试题学习Javascript——面向对象(创建对象)
- javascript面向对象系列第二篇——创建对象的5种模式
- javascript开发:javascript面向对象、创建对象总结