function Person(name) {
this.name = name;
}
Person.prototype.getName = function() {
return this.name
}
var a = new Psrson('sven')
console.log(a.name) // 'sven'
console.log(a.getName()) // 'sven'
console.log(Object.getPrototypeOf(a) === Person.prototype) // true
console.log(a)
由上面这个例子可以知道new在执行时做了哪些事情:
- 创建一个新对象
- 将传入的参数变为了新对象的属性,这是构造函数内部的具体实现决定的
- 让新对象的原型指向构造函数的prototype属性(构造函数的prototype的constructor属性默认指向构造函数本身)
- 返回一个对象
所以根据上面这几条,我们可以模拟一下new的实现过程:
function Person(name) {
this.name = name;
}
Person.prototype.getName = function() {
return this.name;
}
var objectFactory = function() {
var obj = new Object(),
Constructor = [].shift.call(arguments);
obj.__proto__ = Constructor.prototype;
var ret = Constructor.apply(obj, arguments);
return typeof ret === 'object' ? ret : obj;
}
var a = objectFactory(Person, 'sven')
console.log(a.name)
console.log(a.getName())
console.log(Object.getPrototypeOf(a) === Person.prototype)
console.log(a)
可以看出,上下两个并没有什么区别
网友评论