Javascript对象继承如何获取Child实例名称

时间:2014-01-14 13:55:03

标签: javascript oop

/**
 * adds an entry to the list
 * 
 * @param data {Object}
 * @return this
 */
ElementList.prototype.addEntry = function(data){
    if (!data) return this;

    data['type'] = this.children_type;

    // add the entry to the current elements
    this.element_list.push(new FavoriteEntry(data));

    this.refresh();

    return this;
};

/**
 * favorites extend ElementList
 *
 * @param setting_list
 * @constructor
 */
function FavoriteList(setting_list){
    ElementList.call(this, setting_list);
}

FavoriteList.prototype = new ElementList();
FavoriteList.constructor = FavoriteList;

所以这是我的教育项目的简短代码片段。 我想要做的是减少重复代码,所以我创建了一个通用的ElementList对象 所以

  • 示例FavoriteList隐藏父对象原型
  • 构造函数指向Childobject
  • 在子项中调用Parent构造函数。

这完全正常我的问题是

 // add the entry to the current elements
this.element_list.push(new FavoriteEntry(data));

这应该基于CHILD创建一个对象的新实例,因此我需要获取调用父方法的子实例的名称

我试过了   - this.constructor(指向父母)   - this.constructor.name   - 这个最喜欢的列表(工作)

因为我不想传递一个名字,我认为迭代实例“选项”并不是很聪明。

我想问一下如何在父元素方法体中访问子实例名称。

我只需要一个明确的答案!!我已经阅读了解决方法!如果不可能这么说:)

提前thx:)

3 个答案:

答案 0 :(得分:1)

this.element_list.push(new FavoriteEntry(data));
     

这应该基于CHILD创建一个对象的新实例   因此,我需要获取正在调用的子实例的名称   父方法

不,你似乎不需要知道这个名字。您只需要一个辅助函数来生成新的Entry实例,可以覆盖它们以生成更具体的条目。也许你已经通过children_type传递data来实现这一点。

  

我试过 - this.constructor(指向父母)

如果您正确设置了constructor,它应该可以正常工作。将您的代码更改为

FavoriteList.prototype.constructor = FavoriteList;
//          ^^^^^^^^^^

此外,您可能希望use Object.create instead of new设置原型链。

答案 1 :(得分:1)

我不确定我是否完全理解,但代码new FaforiteEntry应根据当前对象类型创建FororiteEntry或其他类型。

以下示例可能会帮助您:

var ElementList = function(args) {
  this.element_list = [];
}
ElementList.prototype.addEntry = function(args) {
  this.element_list.push(new this.entryType(args.val));
};
//will create element_list items of type String
ElementList.prototype.entryType = String;

function FavoriteList(args) {
  ElementList.call(this, args);
}
FavoriteList.prototype = Object.create(ElementList.prototype);
FavoriteList.constructor = FavoriteList;
//will create element_list items of type Array
FavoriteList.prototype.entryType = Array;

//adding entries to f would create items of type Array
var f = new FavoriteList();
f.addEntry({val: 2});
console.log(f.element_list);//[[undefined, undefined]]
//adding entries to e would create items of type String
var e = new ElementList();
e.addEntry({val: 2});
console.log(e.element_list);//[ String { 0="2"...

答案 2 :(得分:1)

简单的代码示例:

 function Parent(){
        // custom properties
    }

    Parent.prototype.getInstanceName = function(){
        for (var instance in window){
            if (window[instance] === this){
                return instance;
            }
        }
    };

    var child = new Parent();

    console.log(child.getInstanceName()); // outputs: "child"