原型:所有函数默认拥有一个prototype,并不可枚举的属性,它会指向另外一个对象;
原型继承:js中并不会将一个对象('类')复制到另一个对象('实例')中,只是将他们关联起来; (更准确应该是“委托”,其函数更多描述的是对象的关联机制,因为JS默认并不会复制对象的属性;)
所有模拟类复制行为方法,都没有用到[[prototype]]链机制;
[[prototype]]是内置属性,表示对其他对象的引用;
Object.create(...):创建返回一个新对象,并把新对象中的[[prototype]]关联到指定对象上;
var father = {
a: 2
};
var sun = Object.create(father);
sun.a // 2
father.hasOwnProperty('a') // true
sun.hasOwnProperty('a') // false
构造函数
-new会劫持所有普通函数,并用构造函数对象的形式来调用它;
比如:
function a(){ // 普通函数
console.log('a')
}
var b = new a() // 'a'
b // {}
-最准确的理解:所有带new的函数调用;
-函数不是构造函数,但是当且仅当使用new时,函数调用才会变成“构造函数调用”;
function Foo() {...};
Foo.prototype = {...}
var a = new Foo()
a.constructor === Foo // false
a.constryctor === Object // true
注:
a.constructor只是通过默认的[[prototype]]委托指向,这和“构造”毫无关系;
如果新创建一个对象,并替换默认的.prototype对象引用,那么新对象并不会自动获得.constructor属性;