成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

js實(shí)現(xiàn)繼承的方法中為何總是要修正constructor方法的指向呢?

fancyLuo / 2149人閱讀

摘要:由于屬性是可以變更的,所以未必真的指向?qū)ο蟮臉?gòu)造函數(shù),只是一個(gè)提示。不過(guò),從編程習(xí)慣上,我們應(yīng)該盡量讓對(duì)象的指向其構(gòu)造函數(shù),以維持這個(gè)慣例。

問(wèn)題引入

最近看了許多關(guān)于js繼承實(shí)現(xiàn)的相關(guān)文章,許多實(shí)現(xiàn)方式中都會(huì)存在這么一行代碼:

A.prototype.constructor = A

于是感到好奇,這行代碼的實(shí)際意義是什么?如果沒(méi)有的話,還能達(dá)到繼承的目的嗎?

前置知識(shí)

為了熟悉javascript中與原型相關(guān)的幾個(gè)基本概念,可以參看這篇文章JavaScript深入之從原型到原型鏈,作者寫的十分簡(jiǎn)明易懂。

讀了文章以后可以知道,在方法(構(gòu)造函數(shù))上存在一個(gè)叫做prototype的屬性,這個(gè)屬性是一個(gè)對(duì)象;方法結(jié)合new關(guān)鍵字可以生成實(shí)例,生成的每一份實(shí)例上都會(huì)有一個(gè)叫做__proto__的屬性,這個(gè)屬性也是指向生成該實(shí)例的方法上的prototype屬性;原型對(duì)象(即prototype這個(gè)對(duì)象)上也存在一個(gè)特別的屬性,即constructor,這個(gè)屬性指向的方法本身。

回到問(wèn)題本身

我們先來(lái)回答第二個(gè)問(wèn)題:如果沒(méi)有這行代碼,還能到達(dá)繼承的目的嗎?
看一個(gè)常見(jiàn)的組合繼承的實(shí)現(xiàn)方式,代碼如下:

function Animal(name) {
    this.name = name || "";
    console.log("Animal called.");
}
Animal.prototype.showName = function() {
    console.log("Name is: ", this.name);
}
function Cat(name, age) {
    Animal.call(this, name);
    this.age = age || 1;
    console.log("Cat called.");
}
Cat.prototype = new Animal();
// Cat.prototype.constructor = Cat;    // 注釋掉修正constructor方法的指向的這一行
Cat.prototype.showAge = function() {
    console.log("Age is: ", this.age);
}

var cat = new Cat("meow", 3);
console.log(cat.name);    // meow
cat.showName();          // Name is: meow
console.log(cat.age);    // 3
cat.showAge();           // Age is: 3

可以看到,繼承的效果依然是達(dá)到了。所以,我覺(jué)得答案應(yīng)該是能。

我們?cè)賮?lái)看第一個(gè)問(wèn)題,注釋掉的這行代碼的意義是什么呢?為什么大部分的實(shí)現(xiàn)方式中都建議我們修正這個(gè)constructor的指向呢?
網(wǎng)上搜索后找到這篇文章: 為什么要做A.prototype.constructor=A這樣的修正?, 并由此進(jìn)一步的查看了Stack Overflow上的這篇問(wèn)答: What it the significance of the Javascript constructor property?
所以,最重要的修正意義應(yīng)該還是針對(duì)顯示調(diào)用的時(shí)候。
接著剛剛的代碼來(lái)看:

cat.__proto__.constructor  // 這個(gè)屬性指向的應(yīng)該是 Animal 構(gòu)造函數(shù),如果我們之前修正了constructor的指向的話,那么這里才會(huì)真的指向到 Cat 的構(gòu)造函數(shù)

// 假設(shè)我們想要構(gòu)造一個(gè)新的實(shí)例cat2,并且我們不知道對(duì)應(yīng)的構(gòu)造函數(shù)的名稱是什么,不過(guò)好在我們剛剛已經(jīng)有一個(gè)實(shí)例cat了(好吧,我知道這種假設(shè)比較2 -_-|||)
var cat2 = new cat.__proto__.constructor();  // Animal called (這里只有Animal的構(gòu)造函數(shù)被調(diào)用了)
cat2.age;    // undefined  (因?yàn)樵贏nimal構(gòu)造函數(shù)中不存在age屬性)

好吧,我承認(rèn)這種場(chǎng)景比較少見(jiàn)。但是,萬(wàn)一有呢?所以我的建議是,我們應(yīng)該保留這種修正constructor的寫法。

后記

在知乎的一篇問(wèn)答中看到一種說(shuō)法

constructor其實(shí)沒(méi)有什么用處,只是JavaScript語(yǔ)言設(shè)計(jì)的歷史遺留物。由于constructor屬性是可以變更的,所以未必真的指向?qū)ο蟮臉?gòu)造函數(shù),只是一個(gè)提示。不過(guò),從編程習(xí)慣上,我們應(yīng)該盡量讓對(duì)象的constructor指向其構(gòu)造函數(shù),以維持這個(gè)慣例。

作者:賀師俊
鏈接:https://www.zhihu.com/questio...
來(lái)源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

參考文章

JavaScript深入之從原型到原型鏈

為什么要做A.prototype.constructor=A這樣的修正?

What it the significance of the Javascript constructor property?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/97020.html

相關(guān)文章

  • js原型和繼承

    摘要:舉例說(shuō)明組合繼承組合繼承利用原型鏈借用構(gòu)造函數(shù)的模式解決了原型鏈繼承和類式繼承的問(wèn)題。示例組合式繼承是比較常用的一種繼承方法,其背后的思路是使用原型鏈實(shí)現(xiàn)對(duì)原型屬性和方法的繼承,而通過(guò)借用構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)對(duì)實(shí)例屬性的繼承。 對(duì)js原型和繼承的理解一直處于不懂-懂-不懂-懂-不懂。。。的無(wú)限循環(huán)之中,本來(lái)打算只是簡(jiǎn)單總結(jié)下js繼承方式,可看了些網(wǎng)上的資料后,發(fā)現(xiàn)又不懂繼承了。。。這篇文章只...

    Hujiawei 評(píng)論0 收藏0
  • new 操作符到底做了什么?

    摘要:原文相信很多才接觸前端的小伙伴甚至工作幾年的前端小伙伴對(duì)這個(gè)操作符的了解還停留在一知半解的地步,比較模糊。 原文:http://blog.xieyangogo.cn/201... 相信很多才接觸前端的小伙伴甚至工作幾年的前端小伙伴對(duì)new這個(gè)操作符的了解還停留在一知半解的地步,比較模糊。就比如前不久接觸到一個(gè)入職兩年的前端小伙伴,他告訴我new是用來(lái)創(chuàng)建對(duì)象的,無(wú)可厚非,可能很多人都...

    _ivan 評(píng)論0 收藏0
  • ECMAScript 6入門類繼承筆記

    類繼承 看類繼承前,先回顧構(gòu)造函數(shù)怎么實(shí)現(xiàn)對(duì)象的繼承的 function F() { this.a = 1; } function Son() { F.call(this); } function inherit(S, F) { S.protot...

    _DangJin 評(píng)論0 收藏0
  • JavaScript面向?qū)ο?/b>

    摘要:構(gòu)造函數(shù)的兩個(gè)特征函數(shù)內(nèi)部使用了,指向所要生成的對(duì)象實(shí)例。將一個(gè)空對(duì)象的指向構(gòu)造函數(shù)的屬性,這個(gè)對(duì)象就是要返回的實(shí)例對(duì)象。用面向?qū)ο箝_(kāi)發(fā)時(shí),把要生成的實(shí)例對(duì)象的特有屬性放到構(gòu)造函數(shù)內(nèi),把共有的方法放到構(gòu)造函數(shù)的里面。 JS中面向?qū)ο蟮母拍?面向?qū)ο驩OP是一種組織代碼結(jié)構(gòu)、實(shí)現(xiàn)功能過(guò)程的思維方式。它將真實(shí)世界各種復(fù)雜的關(guān)系,抽象為一個(gè)個(gè)對(duì)象,然后由對(duì)象之間的分工與合作,完成對(duì)真實(shí)世界的...

    Eirunye 評(píng)論0 收藏0
  • ES5/ES6 繼承

    摘要:原型鏈構(gòu)造函數(shù)原型實(shí)例的關(guān)系每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象,原型對(duì)象都包含一個(gè)指向構(gòu)造函數(shù)的指針,實(shí)例有一個(gè)指向原型對(duì)象的指針構(gòu)造函數(shù)原型對(duì)象構(gòu)造函數(shù)構(gòu)造函數(shù)操作符實(shí)例對(duì)象構(gòu)造函數(shù)實(shí)例對(duì)象原型對(duì)象如果試 原型鏈 構(gòu)造函數(shù)/原型/實(shí)例 的關(guān)系 每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象,原型對(duì)象都包含一個(gè)指向構(gòu)造函數(shù)的指針,實(shí)例有一個(gè)指向原型對(duì)象的指針 構(gòu)造函數(shù) --(prototype)-->...

    libin19890520 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<