原型

139 阅读1分钟

原型:所有函数默认拥有一个prototype,并不可枚举的属性,它会指向另外一个对象;

原型继承:js中并不会将一个对象('类')复制到另一个对象('实例')中,只是将他们关联起来; (更准确应该是“委托”,其函数更多描述的是对象的关联机制,因为JS默认并不会复制对象的属性;)

截屏2021-08-07 下午1.17.29.png

所有模拟类复制行为方法,都没有用到[[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属性;