原型 原型鏈和繼承

2021-10-10 02:34:26 字數 1505 閱讀 2456

看一段**就明白了

function

person

(nick, age)

person.prototype.

sayname

=function()

var p1 =

newperson

('byron',20

);var p2 =

newperson

('casper',25

);p1.

sayname()

// byron

p2.sayname()

// casper

p1.__proto__ === person.prototype //true

p2.__proto__ === person.prototype //true

p1.__proto__ === p2.__proto__ //true

person.prototype.constructor === person //true

當試圖訪問乙個物件的屬性時,它不僅僅在該物件上搜尋,還會搜尋該物件的原型,以及該物件的原型的原型,一次層層向上搜尋,知道找到乙個名字匹配的屬性到達原型鏈的末尾

每個物件都有乙個_proto_,它指向它的prototype原型物件,而prototype原型物件又具有乙個自己的prototype原型物件,就這樣層層往上直到乙個物件的原型prototype為null

function

person

(name, age)

// 方法定義在建構函式的原型上

person.prototype.

getname

=function()

function

teacher

(name, age, subject)

teacher.prototype = object.

create

(person.prototype)

teacher.prototype.constructor = teacher

我們都知道類的方法都定義在prototype裡,那其實我們只需要把person.prototype的備份賦值給teacher.prototype即可

object.create簡單來說就是新建乙個物件,使用現有的物件賦值給新建物件的_proto_

為什麼是備份呢?

因為如果直接賦值,那會是引用關係,意味著修改teacher.prototype,也會同時修改person.prototype,這是不合理的。

另外注意的一點,在給teacher類新增方法時,應該在修改prototype以後,否則會被覆蓋掉,原因是賦值前後的屬性值時不同的物件

最後還有乙個問題,我們都知道prototype裡有個屬性constructor指向建構函式本身,但是意外呢我們是複製其他類的prototype,所有這個指向是不對的,需要更正一下,如果不修改,會導致我們型別判斷出錯

原型 原型鏈 繼承

原型 是function物件的乙個屬性,它定義了建構函式 製造出的物件 的公共祖先。通過該建構函式產生的物件,可以繼承該原型的屬性和方法。原型也是物件 這定義有點模糊,用 解釋一下 我們在控制台中列印出了這個,首先son物件的建構函式是foo,但是我們的foo中什麼屬性都沒有,怎麼會出現乙個 pro...

原型 原型鏈 繼承

在 js 中,一切皆物件!下面就讓我們從建立物件開始,逐步學習js中的核心知識 原型,原型鏈,繼承等 1.字面量方式建立物件 var obj var obj1 2.使用 new object 的方式建立物件 var obj2 new object obj2.name 張三 obj2.age 13 o...

原型鏈和繼承

原型鏈 它是繼承的主要方法,其基本思想是讓乙個引用型別繼承另外乙個引用型別的屬性和方法。每個建構函式都一有乙個prototype屬性,它指向它的原型物件 原型物件包含了 該建構函式所建立的 所有例項 共享的 屬性和方法 假如讓乙個原型物件等於另外乙個型別的例項,那麼該物件的例項可以訪問另外一種原型的...