摘要:學習原型與繼承的時候,經(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
摘要:背景在工作中雖然我經(jīng)常使用到庫但是很多時候對的一些概念還是處于知其然不知其所以然的狀態(tài)因此就萌生了學習源碼的想法剛開始看源碼的時候自然是比較痛苦的主要原因有兩個第一網(wǎng)上沒有找到讓我滿意的詳盡的源碼分析的教程第二我也是第一次系統(tǒng)地學習這么大代 背景 在工作中, 雖然我經(jīng)常使用到 Netty 庫, 但是很多時候對 Netty 的一些概念還是處于知其然, 不知其所以然的狀態(tài), 因此就萌生了學...
摘要:中的同名的實際上就是我們在的原型繼承中使用的構造函數(shù),所以中的是對中的構造函數(shù)的一種包裝。我們發(fā)現(xiàn),在中設定的屬性被放在的構造函數(shù)中,而方法則以鍵值對的形式傳入一個函數(shù)中。大家是不是對這種繼承模式似曾相識呢對了,這就是所謂的構造函數(shù)竊取。 ES6中增加了一些新特性,但從底層的角度來說,只是一些語法糖。但是就我個人來說,如果不了解這些語法糖的本質,是用不安心的。那我們要如何揭開這些語法糖...
摘要:還在上班很無聊數(shù)字華容道暢玩地址開發(fā)源碼地址這個叫前言年末了。光隨機生成一個亂序數(shù)列是不夠的,還得保證這個數(shù)列的逆序數(shù)為偶數(shù),嗦嘎。所以,我們直接將交換的次數(shù),記為數(shù)列逆序數(shù)個數(shù),就達到了想要的效果。 還在上班?很無聊?數(shù)字華容道暢玩地址 開發(fā)源碼地址 這個叫前言 年末了。哦,不,要過年了。以前只能一路站到公司的我,今早居然是坐著過來的。新的一年,總要學一個新東西來迎接新的未來吧,所以...
閱讀 1369·2021-10-13 09:39
閱讀 1333·2021-09-23 11:22
閱讀 2243·2019-08-30 14:05
閱讀 1059·2019-08-29 17:03
閱讀 771·2019-08-29 16:24
閱讀 2227·2019-08-29 13:51
閱讀 656·2019-08-29 13:00
閱讀 1290·2019-08-29 11:24