看一段**就明白了
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屬性,它指向它的原型物件 原型物件包含了 該建構函式所建立的 所有例項 共享的 屬性和方法 假如讓乙個原型物件等於另外乙個型別的例項,那麼該物件的例項可以訪問另外一種原型的...