有没有办法在Javascript函数中更改原型?

时间:2010-06-19 17:24:58

标签: javascript prototype

我在Javascript中有这种类型的原型继承代码。

function A() {
    this.a = 1;
}
function B() {
    someEl.innerHTML(this.a);
}
B.prototype = new A();

但是,我想知道是否有更好的方法,最好是将原型声明带入B的声明。

我尝试在this.prototype中设置B,但它只显示this.aundefined

那么,有没有更好的方法呢?

4 个答案:

答案 0 :(得分:4)

prototype属性只能在constructor functions中使用,this.prototype没有意义,因为this只是新的对象实例,而不是构造函数。

在构造函数内部分配prototype不是一个好主意,因为每次创建新对象时都会执行该赋值(new B();)。

您的代码对我来说似乎是完全有效的,您唯一应该注意的是,如果您替换构造函数的prototype属性,就像使用B.prototype = new A(); constructor B 1}} A的对象实例的属性将指向function A() { this.a = 1; } function B() { someEl.innerHTML(this.a); } B.prototype = new A(); B.prototype.constructor = B; // restore the `constructor` property var foo = new B; foo.constructor === B; // true

通常建议您恢复该属性,例如:

{{1}}

看看:

答案 1 :(得分:0)

尝试:

function A() {
    this.a = 1;
}
function B() {
    this.prototype = new A();
    someEl.innerHTML(this.A.a); //notice A.a
}

答案 2 :(得分:0)

function MyClass() {
    this.initialize();
}

MyClass.prototype = {
    initialize: function() {               // adding a function name
        this.some_var = "Blue";            // makes debugging easier
    },
    tell_color: function() {
        alert(this.color);
    },
    color: "red"
}

var instance = new MyClass();
instance.tell_color();

这不是我的想法,但我不知道在哪里找到它。

答案 3 :(得分:0)

JS中的继承有点奇怪,但其他人都是正确的,你永远不应该在构造函数中放置原型。原型函数/变量的要点是,您只能为所述类的所有实例使用该函数的单个实例。同样,它对类变量也有好处,类变量是每个实例都会引用的奇异值。

真的,你应该让B级继承自A类:

function B(){
     this.object = new A();
}

B.prototype.a = function(){
     return object.a;
}

这可能有点烦人,因为你必须创建新的getter / setter,buuuuuuuttttt,如果你感觉有点冒险,你可以建立这样的东西......

function breakApart(what){
     var functions = [];
     var properties = [];

     for(property in what){
         if(typeof what[property] == 'function'){
             functions.push({'name':property,'value':what[property]});
         }else{           
             properties.push({'name':property,'value':what[property]});
         }
     }

     var data = [
         {'title':'functions','data':functions},
         {'title':'properties', 'data':properties}
         ];

     return data;
}

添加一些eval()调用和一些逻辑,你可以让这个函数构建你新的getter / setters / function references。