我有一个DTO类型,它实际上是键/值对的映射。我通常会使用一个对象文字来表示这一点,但是这会将[[prototype]].constructor
设置为有意义值的结果对象预先制作。
e.g。
function MyDto() {
var o = {
myProperty: null
};
return o; //[[prototype]].constructor is meaningless
}
有没有办法做类似的事情,但是将[[prototype]].constructor
属性设置为更有意义的MyDto
(而不是Object
)?
答案 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框架都可以找到类似的实现。)