以下是我的嘗試過程
function Parent() {
this.count = 1;
this.addCount = function() {
console.log(++this.count);
};
this.items = [];
this.addItem = function(item) {
this.items.push(item);
console.log(this.items);
};
}
function Child() {
}
Child.prototype = new Parent();
var child1 = new Child();
var child2 = new Child();
child1.addCount(); // 2
child2.addCount(); // 2
child1.addItem('child1'); // child1
child2.addItem('child2'); // child1, child2
console.log(child1);
/*
count: 2
__proto__: Parent
count: 1
items: ['child1', 'child2']
addCount: function
addItem: function
*/
發(fā)現(xiàn)有個(gè)問題,引用屬性共享了
// 忽略未修改的代碼
function Child() {
Parent.call(this); // 顯示調(diào)用父類的構(gòu)造函數(shù)
}
console.log(child1);
/*
count: 2
items: ['child1']
addCount: function
addItem: function
__proto__: Parent
count: 1
items: []
addCount: function
addItem: function
*/
重復(fù)定義了addCount和addItem方法
// 忽略未修改的代碼
function Parent() {
this.count = 1;
this.items = [];
}
Parent.prototype.addCount = function() {
console.log(++this.count);
};
Parent.prototype.addItem = function(item) {
this.items.push(item);
console.log(this.items);
};
console.log(child1);
/*
count: 2
items: ['child1']
__proto__: Parent
count: 1
items: []
addCount: function
addItem: function
*/
從結(jié)果上看簡(jiǎn)單實(shí)現(xiàn)了繼承,但是有幾個(gè)疑問:
大家是怎么使用原型鏈實(shí)現(xiàn)繼承的呢?
--------------- 2018/1/18 13:45 ------------------------
看了@Maxiye提供的文章,也許可以使用簡(jiǎn)單的混合實(shí)現(xiàn),類似于php的trait,針對(duì)某些情況可能比較適用
// 去掉原型鏈關(guān)聯(lián)
// Child.prototype = new Parent();
function Child() {
Parent.call(this);
}解釋一下"First" 的輸出結(jié)果。
function Parent() {
this.count = 1;
this.addCount = function() {
console.log(++this.count);
};
this.items = [];
this.addItem = function(item) {
this.items.push(item);
console.log(this.items);
};
}
function Child() {
}
Child.prototype = new Parent();
var child1 = new Child();
var child2 = new Child();
child1.addCount(); // 2
child2.addCount(); // 2
child1.addItem('child1'); // child1
child2.addItem('child2'); // child1, child2
你這個(gè)代碼的問題不是不能繼承。其實(shí)child1 和child2 都繼承了Parent 的property.
var child1 = new Child(); // child1 : {} initial 了一個(gè)空的child1, 它的__.proto__ 是 new Parent()
var child2 = new Child(); // child2 : {} initial 了一個(gè)空的child2, 它的__.proto__ 是 new Parent()
child1.addCount(); // child1: {count: 2} 調(diào)用child1的addCount(), 沒有這個(gè)函數(shù),找原型鏈, 找到, 這時(shí)候 addCount() 中的this 指向的是child1, 所以++this.count 相當(dāng)于:this.count = this.count + 1, 相當(dāng)于一個(gè)賦值: child1.count = 2;
child2.addCount(); // child2: {count: 2} 原理同上
child1.addItem('child1'); // child1: {count: 2} 調(diào)用 child1中的addItem(),沒有這個(gè)函數(shù),找原型鏈,找到。 這時(shí)候addItem()中的this 指向的也是child1, 但是child1 沒有items這個(gè)property,不能push,所以只能找原型鏈中的items,找到。所以這個(gè)push ,就是對(duì)原型鏈里面的items.push(child1).
child2.addItem('child2'); // child2: {count: 2} 調(diào)用 child2中的addItem(),沒有這個(gè)函數(shù),找原型鏈,找到。 這時(shí)候addItem()中的this 指向的也是child2, 但是child2 沒有items這個(gè)property,所以只能找原型鏈,找到。所以這個(gè)push ,就是對(duì)原型鏈里面的items.push(child2), 所以原型鏈里面的items 就是[child1, child2].
加一行代碼就能實(shí)現(xiàn)你想要的繼承:
function Parent() {
this.count = 1;
this.addCount = function() {
console.log(++this.count);
};
this.items = [];
this.addItem = function(item) {
this.items=[];//加了這一行,每一個(gè)調(diào)用addItem的child,都給它initial 一個(gè)items
this.items.push(item);
console.log(this.items);
};
}
function Child() {
}
Child.prototype = new Parent();
var child1 = new Child();
var child2 = new Child();
child1.addCount(); // 2
child2.addCount(); // 2
child1.addItem('child1'); // child1
child2.addItem('child2'); // child2北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問,美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。