继承对象

时间:2011-07-19 14:43:18

标签: javascript class scope prototypal-inheritance

我已经读过Javascript的继承是原型的。它是什么意思?程序员定义的对象如何继承预定义对象(如窗口)的属性? 例如,我需要在我自己的类中使用函数eval()。如何实现?

3 个答案:

答案 0 :(得分:3)

撇开是否继承window的问题,这是一个简单的示例,演示如何来执行此操作:

function Test() {
    // constructor code
}

Test.prototype = window;

var t = new Test();
t.eval();

使用new运算符调用时,Test函数会创建Test的新实例,其原型链接到window对象。函数的原型可以是任何对象。

答案 1 :(得分:1)

Protip:不要使用new来声明对象。 Object.create是创建JavaScript对象的正确方法。它在所有现代浏览器中都受支持。对于其他浏览器,本文的底部有一个很好的垫片:

http://javascript.crockford.com/prototypal.html

使用'new'的构造函数的一个问题是,如果人们不小心将其称为常规函数,它将使用变量this对全局变量(即在浏览器中的窗口)进行修改,因此this只应保留给原型函数,我更喜欢使用that代替this

我个人使用支持new obj()obj()obj.init()的样式,它可能是一个额外的函数指针,但我认为它增加了语义含义

function obj(){
    var that = Object.create(obj.prototype)
    //any constructor logic goes here
    return that
}
obj.prototype = Object.create(Superclass.prototype)

obj.init = obj //completely optional

//other function declarations

obj.prototype.someFunction = function(){
    //logic for someFunction
}

答案 2 :(得分:0)

你想要什么? 这是原型继承的最简单方法(不是最好的方法):

var obj1=new Object1Constructor();
var obj2=new Object2Constructor();

obj2.prototype=obj1;

这意味着obj1继承了obj2

的所有属性

我忘记了主要的事情:eval == evil;

更新: 我在上面的代码中犯了错误。那不是继承。这是更新的代码:

var Object1Constructor=function(){ // one object constuctor
    //properties definition goes here
}

var Object2Constructor=function(){ // another object constuctor
    //properties definition goes here
}

Object2Constructor.prototype=new Object1Constructor();

var obj=new Object2Constructor();

那就是吸气。现在obj已在Object2ConstructorObject1Constructor - 父级“类”中定义了属性。 请参阅下面的CMS评论。他是完全正确的。