0

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

4

3 回答 3

3

抛开是否应该从 继承的问题window,这里有一个简单的例子来演示如何做到这一点:

function Test() {
    // constructor code
}

Test.prototype = window;

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

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

于 2011-07-19T14:51:34.157 回答
1

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

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

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

我个人使用一种支持new obj(), obj(), and的样式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
}
于 2011-07-19T15:25:18.427 回答
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();

这就是继承。现在objObject2ConstructorObject1Constructor- 父“类”中定义了属性。请参阅下面的 CMS 评论。他是完全正确的。

于 2011-07-19T14:52:51.380 回答