字面量方式和Object构造函数方式创建对象
var dog1 = {
name: 'demu',
age: 3,
color: 'black'
}
var dog2 = {
name: 'jiwawa',
age: 3,
color: 'zongse'
}
// 用Object构造函数创建对象
var dog3 = new Object();
dog3.name = 'guibin';
dog3.age = 3;
dog3.color = 'zongsejin';
var dog4 = new Object();
dog4.name = 'jinmao';
dog4.age = 3;
dog4.color = 'huangse';
优点: 方便
缺点: 当需要创建很对对象的时候,会有很多重复的代码
工厂模式
function madeDog(name, age, color) {
var obj = new Object();
obj.name = name;
obj.age = age;
obj.color = color;
return obj;
}
var jiwawa = new MadeDog('jiwawa',2,'white');
console.log('jiwawa',jiwawa);
var jinmao = new MadeDog('jinmao',2,'yellow');
console.log('jinmao',jinmao);
优点: 解决了字面量方式创建很多类似的对象的问题
缺点: 没有解决对象识别的问题,就是所有对象的爹都是Object
构造函数的方式
原型模式
function Person() {
}
Person.prototype = {
name: 'zhansan',
age: 18,
friends: ['lisi','wangwu']
}
var person1 = new Person();
var person2 = new Person();
// 识别对象
person1 instanceof Person; // true
person1.friends.push('chenliu');
console.log(person2.friends); // ['lisi','wangwu','chenliu']
优点: 解决了对象的归属问题
缺点:
- 原型上的属性都是共享的,一个实例去修改了原型上的属性,会影响到别的实例
- 不能传参
构造函数和原型模式组合创建对象
function Person(name, age) {
this.name = name;
this.age = age;
this.friends = ['李四','王五'];
}
Person.prototype = {
say: function() {
console.log(this.name);
}
}
var person1 = new Person();
var person2 = new Person();
// 识别对象
person1 instanceof Person; // true
person1.friends.push('陈六');
console.log(person1.friends); // ['李四','王五','陈六']
// person1修改了对象属性,不影响person2
console.log(person2.friends); // ['李四','王五']
寄生构造函数模式
function Person() {
this.class = "人类";
}
function Person(name, age) {
// 创建的对象寄生在person上面
var obj = new Person();
obj.name = name;
obj.age = age;
obj.say = function() {
console.log(this.name);
}
return obj;
}
var p = new Person('zhansan',5);
p.say();
寄生式跟工厂模式几乎一样,它的优点在于不会破坏原有对象的属性和方法,又能扩充功能
稳妥构造函数模式
function Person() {
var name = '张三丰';
var age = 100;
var obj = new Object();
obj.getName = function() {
return name;
}
obj.setName = function(newName) {
name = newName;
}
return obj;
}
var p = new Person();
优点: 只能通过getName和setName去访问和设置变量