javascript中为了引入面向对象特性,在函数中加入了__proto__和prototype,所以可以用基于原型链的方法来模拟面向对象编程,
那么__proto__和prototype有什么作用呢? 可以通过测试实例验证其作用。
测试1:
function TestA(){
console.log("construct TestA");
}
TestA.prototype.helloCall = function(){
console.log("I am prototype method call info !");
}
let instA = new TestA();
console.log(TestA.prototype);
console.log(TestA.__proto__);
console.log(instA.prototype);
console.log(instA.__proto__);
instA.helloCall();
以上测试let instA = new TestA();实际上会分成多步:
let instA = {};
instA.__proto__ = TestA.prototype;
TestA.call(instA);
只有对象才有__proto__属性(instA有__proto__属性,而TestA类是没有__proto__属性的,只有prototype属性)
当用instA调用函数或引用属性时,如果在instA对象本身找不到该属性,则会去找instA__proto__里面是否有该方法
或者属性,这样就可以基于原型链模拟继承。
如上测试,instA.helloCall();实例对象instA调用helloCall方法,首先在instA中查找是否有该方法,如果没有就会查找instA.__proto__(就是TestA.prototype,也就是TestA中)中是否有该方法,有则调用。
如果想将公共的属性或方法让父类继承,则可以放在构造函数的prototye上。