1. 程式人生 > >javascript中的call.apply方法是針對function本身定義的內容,並不能將

javascript中的call.apply方法是針對function本身定義的內容,並不能將

ons con ack min span 文章 apply call 發現

最近研究了js的繼承,看了幻天芒的文章http://www.cnblogs.com/humin/p/4556820.html#3947420,明白了最好是使用apply或call方法來實現繼承。

但是對於call能不能將funciton的prototype內容一同復制,有疑惑,實驗之後發現是不行的。看下面的代碼,c.g()系統是報錯不識別,不認為其是一個函數。

function f(){
this.a ="a";
this.b = function(){
console.log("b");
}
/*
this.g = function(){
console.log("this is g in f().");
}
*/
}
f.prototype.g = function(){
console.log("this is g in prototype.");
}

function e(){
f.call(this);
}
var c = new e();
console.log(c.a); //彈出a
c.b(); //彈出b

var ff = new f();
ff.g();//this is g in prototype.
c.g();//c.g is not a function

如果要實現對f的完全繼承,還需要復制其原型鏈中的內容。參考以下代碼:

function f(){
this.a ="a";
this.b = function(){
console.log("b");
}
}
f.prototype.g = function(){
console.log("this is g in prototype.");
}

function e(){
f.call(this);
//f.prototype.call(this);
}

(
function(){
var Super = function(){};
Super.prototype = f.prototype;
e.prototype = new Super();
}
)();
var c = new e();
console.log(c.a); //彈出a
c.b(); //彈出b

var ff = new f();
ff.g();//this is g in prototype
c.g();//this is g in prototype

javascript中的call.apply方法是針對function本身定義的內容,並不能將