js创建对象
- 工厂模式
function Person(name, age){
var o = new Object();
o.name = name;
o.age = age;
o.sayName = function(){
console.log(this.name);
};
return o;
};
var p = new Person('viven', 28);
console.log(p.constructor == Person); // false
工厂模式最大的问题就是不能识别对象,可以用构造函数解决。
- 构造函数
构造函数的创建会经历一下几个步骤
(1) 创建一个新对象;
(2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象);
(3) 执行构造函数中的代码(为这个新对象添加属性);
(4) 返回新对象
function Person(name, age){
this.name = name;
this.age = age;
this.sayName = function() {
console.log(this.name);
};
};
var p = new Person('viven', 28);
console.log(p.constructor == Person); // true
var p1 = new Person('kevin', 30);
console.log(p.sayName == p1.sayName); // false 不是同一个函数。
构造函数解决了工厂函数的对象不能识别的问题,但是出现的新问题就是每次新建一个实例就会新建一个sayName函数,如果有很多,就会创建很多相同的函数。
以上,两个实例的sayName函数不是同一个,造成了资源的浪费,这就引出了原型模式。
- 原型模式
function Person(){};
Person.prototype = {
name: 'viven',
age: 28,
sayName: function() {
console.log(this.name);
}
}
var p = new Person();
var p1 = new Person();
console.log(p.sayName == p1.sayName) // true 是同一个函数
console.log(p.constructor == Person) // false
// 因为直接用对象的方式创建原型,会改写原型,那么constructor指向就会切断原联系,一般会这样做
Person.prototype = {
constructor: Person,
name: 'viven',
age: 28,
sayName: function() {
console.log(this.name);
}
}
console.log(p.constructor == Person) // true
这样就能解决重复创建函数的问题,当然这样就不能传递参数进去,进行个性化的设置,那么我们可以使用构造函数和原型模式的组合来解决这个问题。
- 构造函数和原型模式的组合用法
这样既可以个性化设置自己的属性,同时可以节约内存,创建一个公用函数。
function Person(name, age){
this.name = name;
this.age = age;
};
Person.prototype = {
constructor: Person,
sayName: function() {
console.log(this.name);
}
}
var p = new Person('viven', 30);
var p1 = new Person('kevin', 28);
console.log(p.sayName == p1.sayName) // true
以上就是js创建对象的小知识,当然最主要的了解构造函数和原型的内容。