Javascript从父级中定义的继承类方法访问类变量

时间:2013-10-11 02:49:35

标签: javascript oop prototype

好吧,我是编程/设计原型的新手。 我很乐意帮忙。

问题是为什么“find”方法中的“this.__proto__instances”返回“undefined”?

如果我的方法有误,请原谅我,我很乐意知道调用类方法在类变量数组中查找元素的正确方法,而不必为每个子元素定义方法。

详细问题详见下文代码中的注释。

谢谢。

function Attribute(name,type){
    //some members definition, including uid, name, and type
};

Attribute.prototype.find=function(uid){
    var found_attr=false;
    this.__proto__.instances.forEach(function(attr){ 
        if (attr.uid == uid) found_attr=attr;           
    }); 
    return found_attr;
};
上面的

this.__proto__.instances.forEach(function(attr){是错误的一行。日志说“不能调用每个未定义的方法”

function ReferenceAttribute(arg_hash){
    Attribute.call(this,arg_hash.name,arg_hash.type); 
    //some members definition
    this.pushInstance(this); 
};

this.pushInstance(this);将此实例推送到可正常工作的ReferenceAttribute.prototype.instances

ReferenceAttribute.prototype=new Attribute(); 

ReferenceAttribute使用原型链接方法继承Attribute

ReferenceAttribute.prototype.instances=new Array(); 

上面的行声明包含所有引用属性实例的数组。 对于ReferenceAttribute的每个新对象,它将被推送到此数组中,在方法pushInstance()中完成。 推送总是成功的,我通过控制台记录检查它们。该数组确实包含ReferenceAtribute实例

function ActiveAttribute(arg_hash){
    Attribute.call(this,arg_hash.name,arg_hash.type);
    //some members definition
    this.pushInstance(this); 
};

ActiveAttribute.prototype=new Attribute(); 
ActiveAttribute.prototype.instances=new Array(); 

在程序中使用它

var ref_attr=ReferenceAttribute.prototype.find("a uid"); 

给出错误说它无法调用每个未定义的方法。 它可以调用方法find,因此它可以很好地继承。但是我觉得查找方法定义中的“这个._ proto _instances”是错误的。

编辑:

Attribute.prototype.pushInstance=function(my_attribute){    
    this.__proto__.instances.push(my_attribute);    
}; 

此功能有效。尽管实例数组由ActiveAttribute或ReferenceAttribute拥有,而不是属于Attribute本身,但此函数确实可以将其推送到数组。

2 个答案:

答案 0 :(得分:2)

这是因为你这样做:

var ref_attr=ReferenceAttribute.prototype.find("a uid"); 

ReferenceAttribute.prototype对象是从Attribute构造函数创建的实例,Attribute.prototype没有.instances属性,也没有直接定义.instances属性在对象上。

答案 1 :(得分:2)

user2736012有你的答案,所以只需评论:

__proto__属性未被所有正在使用的浏览器标准化或支持,因此请勿使用它。此外,如果要访问对象[[Prototype]]的属性,请使用标准属性解析:

this.instances

如果你要直接引用继承的方法,继承的重点是什么?