在对象上正确设置原型构造函数

时间:2014-11-25 14:05:47

标签: javascript

我有一个DTO类型,它实际上是键/值对的映射。我通常会使用一个对象文字来表示这一点,但是这会将[[prototype]].constructor设置为有意义值的结果对象预先制作。

e.g。

function MyDto() {
    var o = { 
        myProperty: null
    };

    return o; //[[prototype]].constructor is meaningless
}

有没有办法做类似的事情,但是将[[prototype]].constructor属性设置为更有意义的MyDto(而不是Object)?

4 个答案:

答案 0 :(得分:1)

不太确定你想做什么。但这可能有所帮助..

function MyDto() {
    var o = { 
        myProperty: null
    }; 
    Object.setPrototypeOf(o,MyDto.prototype);
    return o;
}

a = MyDto();
console.log(a);

答案 1 :(得分:1)

要使obj instanceof Foo正常工作,obj的原型必须指向函数prototype属性的值(Foo)。已经提出了几种方法,这是另一种方法:

使用new调用该函数并返回this(隐式或显式)。如果您希望能够在没有new的情况下调用该函数(在您的问题中没有明确说明),请检查函数内部是否使用new调用它:

function MyDto() {
    if (!(this instanceof MyDto)) {
        return new MyDto();
    }
    Object.assign(this, {myProperty: null});
}

注意: constructor属性在内部没有任何意义,只对开发人员使用您的代码。

答案 2 :(得分:0)

我不认为我理解你的问题,但你可以试试这个:

o.constructor = MyDto;

这会将o的构造函数设置为MyDto,但在执行o instanceof MyDto时无效。

如果这是你想要的,我的建议是你实例化MyDto:

function MyDto() {
    this.myProperty = null;
}

var o = new MyDto();
console.log(o instanceof MyDto);       // true
console.log(o.constructor === MyDto);  // true

编辑:如果您在函数中return,那么您将丢失对new实例的引用。在您的情况下,MyDto作为Object实例的工厂,具有名为myPropert的自有属性。

编辑2:我仍然更喜欢其他方式,但使用Object.create也有效:

function MyDto() {
    return Object.create(MyDto.prototype, {
        myProperty: {
            writable: true,
            configurable: true,
            value: null
        }
    });
}

new MyDto() instanceof MyDto;       // true
new MyDto().constructor === MyDto;  // true

答案 3 :(得分:0)

你是从错误的方向接近这个。如果您希望new Class()的结果为真实instanceof Class,则只需扩展默认实例对象,而不是创建并返回新对象。

function Class () {
    _.extend(this, {
        property: 'value',
        // ...
    });
}

(上面的代码使用Lo-Dash函数_.extend()来保持代码简洁和甜美。几乎所有实用程序库或更大的JavaScript框架都可以找到类似的实现。)