new Test():
- create
new Object()
obj - set
obj.__proto__ to Test.prototype
; - return
Test.call(obj) || obj
;
// normally obj is returned but constructors in JS can return a value
Object.create( Test.prototype )
- create
new Object()
obj; - set
obj.__proto__ to Test.prototype
- return obj;
可以看到其实new和Object.create前两个步骤都是一样,区别在第三步,其实就是Object.create
不会执行构造函数,我们来两段更直接的代码
var a = new A();
var b = Object.create(B.prototype)
function A() {
console.log('a')
}
function B() {
console.log('b')
}
// 我们可以看到只输出了a,但是b并没有输出
var a = new A();
var b = Object.create(B.prototype)
function A() {
return {}
}
function B() {
return {}
}
console.log(a)
console.log(b)
// 可以看到a就是{}
// b是一个对象,它的__proto__指向B.prototype
这样应该就很清晰了,Object.create()特殊还在于它的第二个参数,就像Object.defineProperties()
可以定义新的属性或修改现有属性