继承对象

发布于 2024-11-25 05:05:57 字数 103 浏览 2 评论 0原文

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

I have read that Javascript's inheritance is prototypal.What does it mean?How can an object defined by the programer inherit the properties of a predefined object such as window ?
For example I need the function eval() in my own class . How can it be achieved?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

匿名。 2024-12-02 05:05:57

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

function Test() {
    // constructor code
}

Test.prototype = window;

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

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

Setting aside the question of whether you should inherit from window, here's a simple example that demonstrates how to do it:

function Test() {
    // constructor code
}

Test.prototype = window;

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

When invoked using the new operator, the Test function creates a new instance of Test whose prototype is linked to the window object. A function's prototype can be any object.

许一世地老天荒 2024-12-02 05:05:57

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

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

使用“new”的构造函数的一个问题是,如果人们不小心像常规函数一样调用它,它将使用变量 对全局变量(即窗口,如果在浏览器中)进行修改这个,所以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
}

Protip: Don't use new for declaring objects. Object.create is the proper way to create JavaScript objects. It's supported in all modern browsers. For other browsers, a nice shim is at the bottom of this article:

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

One problem with constructors that use 'new' is that if people accidentally call it like a regular function, it will make modifications on the global variable (i.e. window if in the browser) using the variable this, so this should only be reserved for prototype functions, and I prefer to use that instead of this

I personally use a style that supports new obj(), obj(), and obj.init(), which may be one extra function pointer, but I think it adds semantic meaning

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
}
青丝拂面 2024-12-02 05:05:57

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

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 的评论。他是完全正确的。

What do you want exactly echieve to?
Here is the simplest way (not the best) of prototype inheritance:

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

obj2.prototype=obj1;

It means that obj1 inherits all properties of obj2

I've forgot the main thing: eval==evil;

UPDATE:
I've made mistakes in the code above. That is not inheritance. Here is updated code:

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();

And that is inharitance. Now obj has properties defined in Object2Constructor and Object1Constructor - parent 'class'.
See CMS's comment below. He is totally right.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文