1、字面对象【实例】和new的对象实例没有prototype, 只有__proto__。
function fn () {} let obj1 = { value: 1, } let obj2 = new fn(); console.log(obj1.prototype, obj2,prototype); //
2、类型上有prototype, 【类实例】上的__proto__指向的就是类型上的prototype。
class myObject { } let obj = new myObject(); console.log(obj.__proto__ === myObject.prototype);
3、创建类实例后,再在【类型】上的prototype添加属性或方法, 对类实例产生影响。不是对prototype重新赋值!!!
// function myObject() { // } 也可以 class myObject {}; let obj = new myObject(); myObject.prototype.value = 123; myObject.prototype.outValue = function () { console.log(this.value); } obj.outValue();
4、对【类型】的prototype重新赋值的差别。
function myObject() { } // class myObject {}; //---------------------------- // myObject有上面两种声明(定义)方式,效果是不一样的! //---------------------------- let obj = new myObject(); myObject.prototype.value = 123; myObject.prototype.outValue = function () { console.log(this.value); } myObject.prototype = { constructor: myObject, value: 666, logValue: function() { console.log(this.value); } } let obj2 = new myObject(); try { obj2.outValue(); }catch { console.log('myObject只能是function方式声明才可以,不然报错。'); } try { obj2.logValue(); }catch { console.log('myObject只能是class方式声明才可以,不然报错。'); }
5、__proto__与prototype的关系。 prototype里包含一个__proto__指针, 这个指针指向的是【类型】上的prototype。
这个指向过程是在constructor构造函数中完成的。所以生产【类型】的【实例】后,如果对prototype【整体】重新赋值,有可能会造成混乱。
这种混乱是 【4】代码中展示的那样, 由于类型声明用class 和 function 定义的不同,然后对prototpye【整体赋值】还是有差别的。