js中常见的创建对象的方法(1)
工厂模式:抽象了创建具体对象的过程
function createPerson(name, age, job){
var obj = new Object();
obj.name = name;
obj.age = age;
obj,job = job;
obj.sayName = function () {
console.log(this.name);
}
return obj;
}
根据接收参数来创建特定对象的大量副本,工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题,即怎样知道一个对象的类型.
自定义构造函数模式
这个模式可以将创建的对象标记为某个引用类型的实例,与工厂模式相比这就是优势.
构造函数没有任何区别,通过new
操作符调用的函数就是构造函数
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
console.log(this.name);
}
}
// 这个构造函数和工厂模式区别在:没有显示地创建对象,直接将属性和方法赋给了this对象,没有return
使用new加自定义构造函数创建实例的过程:
- 创建一个新对象
- 将构造函数的作用域赋给新对象,因此this指针也就指向了新对象
- 执行构造函数中的代码(为这个新对象添加属性)
- 返回新对象
使用new加自定义构造函数创建的实例都有一个constructor(构造函数)
属性,这个指针指向Person
但是如果要检测一个对象所属的引用类型还是instanceof
这种方法创建对象和下面原理一样:
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = new Funciton("console.log(this.name)");
}
用自定义构造函数的方式创建对象,会导致不同的作用域链和标识符解析,但创建Function 新实例的机制仍然是相同的。因此,不同实例上的同名函数是不相等的.
person1.sayName == person2.sayName;// false person1 和person2是Person的实例
创建两个完成同样任务的 Function 实例的确没有必要,于是可以像下面这样改进:
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = sayName;
}
function sayName(){
console.log(this.name);
}
这样做会带来另一个问题:在全局作用域中定义的函数实际上只能被某个对象调用,这让全局作用域有点名不副实。如果对象需要定义很多方法,那么就要定义很多个全局函数,于是我们这个自定义的引用类型就丝毫没有封装性可言了。
这是我的签名