第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

原型上定義的 Javascript 屬性

原型上定義的 Javascript 屬性

眼眸繁星 2023-10-20 16:52:07
我有一個(gè)非常簡單的JS代碼,如下所示;var Worker = function (name) {    this.name = name;}Worker.prototype.jobs = 0;Worker.prototype.Work = function () {    console.log("jobs finished", this.name, ++this.jobs);}var ca = new Worker("ca");var cb = new Worker("cb");ca.Work();// shows 1cb.Work();// shows 1 (Q: Why is this not printed 2 ?)現(xiàn)在上面的代碼為 this.jobs 打印了 1 次。我期望由于屬性“jobs”是在原型上定義的,因此它將是一個(gè)共享的屬性(并且每個(gè)實(shí)例都不是真正的不同副本)。但事實(shí)似乎并非如此。我的理解哪里錯(cuò)了,我錯(cuò)過了什么?
查看完整描述

4 回答

?
達(dá)令說

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個(gè)贊

通過將其添加到原型中,您可以將其作為實(shí)例方法/屬性使用。為了讓它按照您想要的方式運(yùn)行,您需要將其直接添加到 Work:


Worker.jobs = 0;

Worker.Work = function () {

    ++this.jobs;

    return this.jobs;

}

那么你甚至可以這樣做:


Worker.prototype.work = () => {

    console.log("jobs finished", this.name, Worker.Work());

}


查看完整回答
反對 回復(fù) 2023-10-20
?
Qyouu

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊

您調(diào)用的函數(shù)位于原型對象中。但它所指的“this”位于子對象中。僅當(dāng)該屬性不存在時(shí),此[propertyname] 查找才會(huì)沿著原型鏈向上進(jìn)行。


// ++this.jobs is a short for this.jobs = this.jobs +1;

// if the child object is missing this.jobs property, it is fetched from the prototype object. So this assigns the 'jobs' property to current object, but looks it up from the prototype object.

Worker.prototype.Work = function () {

   console.log("jobs finished", this.name, ++this.jobs);

}


查看完整回答
反對 回復(fù) 2023-10-20
?
慕田峪7331174

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊

“this”的使用是指上下文(閉包)。要訪問共享屬性,您應(yīng)該使用“prototype”來代替,以按預(yù)期工作:


var Worker = function (name) {

    this.name = name;

}

Worker.prototype.jobs = 0;

Worker.prototype.Work = function () {

    console.log("jobs finished", this.name, ++Worker.prototype.jobs);

}

var ca = new Worker("ca");

var cb = new Worker("cb");

ca.Work();// shows 1

cb.Work();// shows 1 (Q: Why is this not printed 2 ?)


查看完整回答
反對 回復(fù) 2023-10-20
?
ABOUTYOU

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊

當(dāng)您讀取this.jobs屬性時(shí),查找首先發(fā)生在對象實(shí)例本身作為自己的屬性上,當(dāng)找不到它時(shí),查找發(fā)生在原型鏈上。


因此,由于該jobs屬性是在初始化為 的原型上找到的0,因此該值是從原型中讀取的。


當(dāng)您遞增 時(shí)this.job,這將在遞增操作后創(chuàng)建一個(gè)自己的屬性,這就是為什么我們永遠(yuǎn)不會(huì)看到另一個(gè)實(shí)例中的更改,因?yàn)?成為jobs該特定實(shí)例的自己的屬性:


var Worker = function (name) {

    this.name = name;

}

Worker.prototype.jobs = 0;

Worker.prototype.Work = function () {

    console.log("jobs is an own property =>", this.hasOwnProperty("jobs"));

    ++this.jobs

    console.log("jobs is now an own property =>", this.hasOwnProperty("jobs"));

    console.log("jobs finished", this.name, this.jobs);

}

var ca = new Worker("ca");

var cb = new Worker("cb");

ca.Work();// shows 1

cb.Work();// shows 1


另一方面,如果您直接更改原型上的屬性,您可以看到更改也反映在第二個(gè)實(shí)例上:


var Worker = function (name) {

    this.name = name;

}

Worker.prototype.jobs = 0;

Worker.prototype.Work = function () {

    ++Object.getPrototypeOf(this).jobs

    console.log("jobs finished", this.name, this.jobs);

}

var ca = new Worker("ca");

var cb = new Worker("cb");

ca.Work();// shows 1

cb.Work();// shows 2


查看完整回答
反對 回復(fù) 2023-10-20
  • 4 回答
  • 0 關(guān)注
  • 243 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)