我读过Javascript的继承是原型的。这是什么意思?程序员定义的对象如何继承预定义对象的属性,例如window?例如,我需要在我自己的类中使用函数 eval() 。如何实现?
3 回答
抛开是否应该从 继承的问题window
,这里有一个简单的例子来演示如何做到这一点:
function Test() {
// constructor code
}
Test.prototype = window;
var t = new Test();
t.eval();
当使用new
运算符调用时,该Test
函数会创建一个新实例,Test
其原型链接到window
对象。函数的原型可以是任何对象。
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
}
你到底想达到什么目的?这是原型继承的最简单方法(不是最好的方法):
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 评论。他是完全正确的。