我已经读过Javascript的继承是原型的。它是什么意思?程序员定义的对象如何继承预定义对象(如窗口)的属性? 例如,我需要在我自己的类中使用函数eval()。如何实现?
答案 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
已在Object2Constructor
和Object1Constructor
- 父级“类”中定义了属性。
请参阅下面的CMS评论。他是完全正确的。