純代碼實(shí)現(xiàn)就啰嗦一句,你把它們手打一遍,不理解你打我!
/**
* 被實(shí)例化對(duì)象
*/
function superClass() {
var a = 'aa';
// 通過(guò) this 創(chuàng)建的共有屬性 在被實(shí)例化時(shí)候每個(gè)實(shí)例化對(duì)象都會(huì)創(chuàng)建這個(gè)this的屬性 this相當(dāng)于一個(gè)變量 指向?qū)嵗膶?duì)象,未被實(shí)例化時(shí)指向全局
this.b = 'bb';
this.printA = function () {
console.log(a, 'super printA');
}
}
// 通過(guò)prototype創(chuàng)建的屬性是原型鏈上的只有本對(duì)象這一份 被實(shí)例化對(duì)象公用
superClass.prototype.printB = function () {
console.log(this.b , 'super printB')
}
/**
* 實(shí)例化對(duì)象
*/
var subClass = new superClass();
console.log(superClass.prototype.constructor, 'superClass prototype constructor'); // superClass
console.log(subClass.__proto__.constructor, 'subClass __proto__ constructor'); // superClass
// 實(shí)例化對(duì)象的__proto__ 指向被實(shí)例化對(duì)象的原型prototype,對(duì)象的原型的construct指向?qū)ο笞约?console.log(subClass.__proto__ === superClass.prototype); // true
console.log(superClass.prototype.constructor === superClass); // true
// 總結(jié):
// 1、this 和 prototype的區(qū)別就是 當(dāng)實(shí)例化對(duì)象自身需要這個(gè)屬性時(shí)用被實(shí)例化對(duì)象的屬性this,
// 當(dāng)公用一個(gè)被實(shí)例化對(duì)象的屬性時(shí),被實(shí)例化對(duì)象的屬性用 prototype。
// 2、原型鏈指向
// subClass.__proto__ => superClass.prototype
// superClass.prototype.constructor => superClass