student.prototype = new person();
得到乙個 person 例項,並且這個例項指向構造器的 prototype 屬性和呼叫了建構函式,因為呼叫的建構函式,而 student 只是乙個類,並沒有例項化,只為了繼承,呼叫建構函式建立乙個例項,引數的問題就不容易解決。
例如:當 person() 中有乙個 name 屬性時,而 student 上也有 name 屬性時,當
student.prototype = new person(); person 上的 name:undefined ,並且 student 永遠不會用到 person 上的 name 性,如果 person 上有很多這樣的屬性情況可想而知。
new 操作符所做的事情(var a = new a())
a.首先生成乙個空物件 a = {} ,它是 object 的例項
b.設定 a 的原型鏈 a.proto = a.prototype
c.a.call(a), a 的 this 指向 a,並執行 a 的函式體
d.判斷 a 的返回值型別,
如果 『沒有返回值』 或者 『返回值型別為值型別』 返回 this 即 a (this === a),
如果有返回值,並且返回值型別為引用型別,就返回這個引用型別的物件,替換掉 a
12345
var a = function()var a = new a();
console.log(a) //object{}
解釋:首先 this === a, 但是 a 返回的是 this.proto (a.proto), this.proto 指向了原型物件 object() 建構函式建立的 object 物件,它是乙個引用型別,它替換掉 a ,所以這裡的變數 a 是乙個指標,指向它的原型。
console.log(a.prototype === a); //true
此時 a 建構函式的原型和 a 指標(指向 a.proto)是同乙個物件
var obj = object.create();
object.create()是系統內建函式,引數為物件,返回新建立的物件,並且該物件的原型指向引數
建立空物件,並且物件的 proto 指向引數,既繼承了屬性和方法,本身又有自己的空物件,對於自己新增的屬性和方法不會去更改原型上的屬性和方法。
1234567
8
function person(name)function student(name,klass)
例:
1234567
math.max(1,2,3); // 3
math.max([1,2,3]); // nan
math.max.call(null,1,2,3); // 3
math.max.call(null,1,2,3) === math.max(1,2,3); // true
1234567
891011
1213
1415
1617
1819
2021
2223
2425
function person(name)person.prototype.sayhi = fucntion()
function student(name,klass)
// 使用 object.create() 繼承方法
student.prototype = object.create(person.prototype,
});// 設定自身方法
student.prototype.learn = function(subject)
javascript實現繼承的幾種主要方法
1.原型鏈繼承 var supclass function name,supclass.prototype var sonclass function name,console.log sonclass.prototype sonclass.prototype new supclass 核心 son...
javascript實現繼承的幾種主要方法
1.原型鏈繼承 var supclass function name,supclass.prototype var sonclass function name,console.log sonclass.prototype sonclass.prototype new supclass 核心 son...
javascript實現繼承的幾種主要方法
1.原型鏈繼承 var supclass function name,supclass.prototype var sonclass function name,console.log sonclass.prototype sonclass.prototype new supclass 核心 son...