對js原型物件的拓展和原型物件的重指向的區別的研究

2021-09-08 17:54:55 字數 1500 閱讀 8142

我寫了如下兩段**:

function person(){} var p1 = new person(); person.prototype =  }; p1.sayname(); 

這一段的執行結果是:uncaught typeerror: undefined is not a function

然後我又把它改寫為下面的**:

function person(){} person.prototype =  }; var p1 = new person(); p1.sayname(); 

執行結果卻是沒問題的,為什麼會這樣呢。

原型不是具有動態性嗎,在它上面所做的任何修改不是都會反映到例項上嗎。所以我就有些想不明白了,煩勞哪位大神能給解釋一下。在此先行謝過了。

3採納

讓我來給你解釋一下吧。

看看下面這段**

function person(){} var proto1 = person.prototype; var p1 = new person(); person.prototype =  }; console.log(person.prototype.isprototypeof(p1)); //輸出false console.log(proto1.isprototypeof(p1)); //輸出true 

mdn reference: object.prototype.isprototypeof()

the isprototypeof() method tests for an object in another object's prototype chain.

意思就是:object.isprototypeof(obj)可以用來檢測該原型是否處於obj物件的原型鏈上。

在上面這段**中,首先我將一開始person.prototype的引用指向proto1

最後我重新檢驗發現,person.prototype已經不是p1的原型了,而proto1還是p1的原型。

其實罪魁禍首就是person.prototype =這句話,因為它宣告了乙個新的物件,讓person.prototype指向它。

要實現題主所需要的動態增加屬性的功能可以這麼寫:

function person(){} var p1 = new person(); person.prototype.name = 'hi'; person.prototype.sayname = function() p1.sayname(); 

這樣做就不是重新宣告乙個原型物件,而是對原來的原型物件進行擴充套件

JS原型物件,原型鏈

js中建立物件都是通過建構函式建立的,所以每個物件中都有乙個指向其建構函式的指標constructor var obj new object var arr new array var obj2 字面量建立實質上是上面方式的簡寫 var arr2 var str new string test 建立...

JS原型(一) 原型物件

在了解js原型物件之前,我們需要了解一些基礎知識 首先是建構函式,我們要知道建構函式的幾個特點 建構函式的首字母必須大寫 區分於其他普通函式 內部使用的this物件,指向即將要生成的例項物件。使用new來生成例項物件 由此我們可以得到,任何函式只要通過new操作符來呼叫,那這個函式就可以稱為建構函式...

JS 物件 JS原型 原型鏈

參考學習 js物件 構造器函式 建立物件的函式。物件分為普通物件和函式物件。所有物件都有 proto 屬性 函式物件不止有 proto 屬性,還有prototype屬性 稱為原型物件 1.new function 產生的物件都是函式物件。2.所有函式物件的 proto 都指向function.pro...