国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

揭開JS中constructor的秘密

MorePainMoreGain / 1471人閱讀

摘要:學習原型與繼承的時候,經(jīng)常會碰到,現(xiàn)在來揭開神秘面紗描述所有對象都會從它的原型上繼承一個屬性繼承中的用于設置原型重新分配原始構造函數(shù)現(xiàn)在不手動重置構造函數(shù)用于設置原型重新分配原始構造函數(shù)可以看到除了的不同,重置不重置原始構造函數(shù)對我們的繼承

學習js原型與繼承的時候,經(jīng)常會碰到constructor,現(xiàn)在來揭開神秘面紗
描述:所有對象都會從它的原型上繼承一個 constructor 屬性
var o = new Object;
o.constructor === Object; // true

var a = [];
a.constructor === Array; // true

var a = new Array;
a.constructor === Array // true

var n = new Number(3);
n.constructor === Number; // true
繼承中的constructor
function Person (name, age) {
  this.name = name,
  this.age = age
}
Person.prototype.setAge = function () {
  console.log("111")
}
function Student (name, age, price) {
  Person.call(this, name, age)
  this.price = price
  this.setScore = function () { }
}
Student.prototype = Object.create(Person.prototype)//用于設置原型
Student.prototype.constructor = Student//重新分配原始構造函數(shù)
var s1 = new Student("Tom", 20, 15000)
console.log(s1 instanceof Student, s1 instanceof Person) // true true
s1.setAge() // 111
console.log(s1)  
console.log(s1.constructor) //Student

現(xiàn)在不手動重置構造函數(shù)

function Person (name, age) {
  this.name = name,
  this.age = age
}
Person.prototype.setAge = function () {
  console.log("111")
}
function Student (name, age, price) {
  Person.call(this, name, age)
  this.price = price
  this.setScore = function () { }
}
Student.prototype = Object.create(Person.prototype)//用于設置原型
// Student.prototype.constructor = Student//重新分配原始構造函數(shù)
var s1 = new Student("Tom", 20, 15000)
console.log(s1 instanceof Student, s1 instanceof Person) // true true
s1.setAge() // 111
console.log(s1)  
console.log(s1.constructor) // Person


可以看到除了s1的constructor不同,重置不重置原始構造函數(shù)對我們的繼承沒有影響。

結論就是:constructor是用于識別對象是由哪個構造函數(shù)初始化的,對繼承沒影響
可以看這篇文章:JS constructor探討(一):為什么要設置prototype.constructor?

But!! 什么情況下要手動重置構造函數(shù)??? 那就是你要調用constructor()的時候!!!此時constructor的指向就會產(chǎn)生影響

來一個MDN上的列子:

function Parent() {};
function CreatedConstructor() {}

CreatedConstructor.prototype = Object.create(Parent.prototype);

CreatedConstructor.prototype.create = function create() {
  return new this.constructor();
}

new CreatedConstructor().create().create(); 

為什么報錯,因為CreatedConstructor.prototype.constructor為Parent,所以new CreatedConstructor().create()的結果是Parent{}這個對象,這個對象沒有create方法,所以報錯了

解決辦法:

function Parent() {}; 
function CreatedConstructor() {} 

CreatedConstructor.prototype = Object.create(Parent.prototype); 
CreatedConstructor.prototype.constructor = CreatedConstructor; // set right constructor for further using

CreatedConstructor.prototype.create = function create() { 
  return new this.constructor();
} 

new CreatedConstructor().create().create(); // it"s pretty fine

這時候需要重置CreatedConstructor的構造函數(shù),使constructor重新指向自己

參考文章:JS constructor探討(一):為什么要設置prototype.constructor?
Object?.prototype?.constructor

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

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/103611.html

相關文章

  • 源碼之下無秘密 ── 做最好 Netty 源碼分析教程

    摘要:背景在工作中雖然我經(jīng)常使用到庫但是很多時候對的一些概念還是處于知其然不知其所以然的狀態(tài)因此就萌生了學習源碼的想法剛開始看源碼的時候自然是比較痛苦的主要原因有兩個第一網(wǎng)上沒有找到讓我滿意的詳盡的源碼分析的教程第二我也是第一次系統(tǒng)地學習這么大代 背景 在工作中, 雖然我經(jīng)常使用到 Netty 庫, 但是很多時候對 Netty 的一些概念還是處于知其然, 不知其所以然的狀態(tài), 因此就萌生了學...

    shenhualong 評論0 收藏0
  • ES6 探秘:Classes

    摘要:中的同名的實際上就是我們在的原型繼承中使用的構造函數(shù),所以中的是對中的構造函數(shù)的一種包裝。我們發(fā)現(xiàn),在中設定的屬性被放在的構造函數(shù)中,而方法則以鍵值對的形式傳入一個函數(shù)中。大家是不是對這種繼承模式似曾相識呢對了,這就是所謂的構造函數(shù)竊取。 ES6中增加了一些新特性,但從底層的角度來說,只是一些語法糖。但是就我個人來說,如果不了解這些語法糖的本質,是用不安心的。那我們要如何揭開這些語法糖...

    caoym 評論0 收藏0
  • 用React寫一個數(shù)字華容道,你需要知道秘密

    摘要:還在上班很無聊數(shù)字華容道暢玩地址開發(fā)源碼地址這個叫前言年末了。光隨機生成一個亂序數(shù)列是不夠的,還得保證這個數(shù)列的逆序數(shù)為偶數(shù),嗦嘎。所以,我們直接將交換的次數(shù),記為數(shù)列逆序數(shù)個數(shù),就達到了想要的效果。 還在上班?很無聊?數(shù)字華容道暢玩地址 開發(fā)源碼地址 這個叫前言 年末了。哦,不,要過年了。以前只能一路站到公司的我,今早居然是坐著過來的。新的一年,總要學一個新東西來迎接新的未來吧,所以...

    Jason 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<