Javascript 在对象上正确设置原型构造函数
我有一个DTO类型,它实际上是键/值对的映射。为了简洁起见,我通常会使用对象文本,但这会将结果对象的Javascript 在对象上正确设置原型构造函数,javascript,Javascript,我有一个DTO类型,它实际上是键/值对的映射。为了简洁起见,我通常会使用对象文本,但这会将结果对象的[[prototype]].constructor设置为有意义的值 e、 g 是否有类似的方法,但将[[prototype]].constructor属性设置为更有意义的MyDto(而不是Object) o.constructor = MyDto; 这将把o的构造函数设置为MyDto,但在执行o MyDto的instanceof时没有效果 如果这是您想要的,我建议您实例化MyDto: funct
[[prototype]].constructor
设置为有意义的值
e、 g
是否有类似的方法,但将
[[prototype]].constructor
属性设置为更有意义的MyDto
(而不是Object
)
o.constructor = MyDto;
这将把o
的构造函数设置为MyDto
,但在执行o MyDto的instanceof
时没有效果
如果这是您想要的,我建议您实例化MyDto:
function MyDto() {
this.myProperty = null;
}
var o = new MyDto();
console.log(o instanceof MyDto); // true
console.log(o.constructor === MyDto); // true
编辑:如果在函数中返回
,则会丢失对新
实例的引用。在您的情况下,MyDto
作为工厂,用于创建具有自己的名为myPropert
的属性的Object
实例
编辑2:我仍然喜欢另一种方式,但使用对象。创建也可以:
function MyDto() {
return Object.create(MyDto.prototype, {
myProperty: {
writable: true,
configurable: true,
value: null
}
});
}
new MyDto() instanceof MyDto; // true
new MyDto().constructor === MyDto; // true
不太清楚你想做什么。但这可能会有帮助
function MyDto() {
var o = {
myProperty: null
};
Object.setPrototypeOf(o,MyDto.prototype);
return o;
}
a = MyDto();
console.log(a);
你走错方向了。如果希望new Class()
的结果成为类的真实实例,只需扩展默认实例对象,而不是创建并返回新实例
function Class () {
_.extend(this, {
property: 'value',
// ...
});
}
(上面的代码使用函数.extend()
来保持代码的简洁。在几乎所有的实用程序库或更大的JavaScript框架中都可以找到类似的实现)。使Foo的obj实例工作,obj
的原型必须指向函数的prototype
属性(Foo
)的值。已经提出了两种方法,下面是另一种:
使用new
调用函数并返回this
(隐式或显式)。如果您想在不使用new
的情况下调用函数(您的问题不太清楚),请检查函数内部是否使用new
调用:
function MyDto() {
if (!(this instanceof MyDto)) {
return new MyDto();
}
Object.assign(this, {myProperty: null});
}
注意:构造函数
属性在内部没有任何意义,只对使用代码的开发人员有意义。您希望它设置为什么?正确设置是什么意思?我希望o.[prototype]]。构造函数
设置为指向MyDto
。类似这样的内容:函数MyDto(){return{constructor:MyDto,myProperty:null};}
?这不是我想要的。相反,我想要新的MyDto()instanceof MyDto
返回true,同时使用对象文字方法实现简洁。如果在函数内返回,则即使使用new调用,它也会像函数一样运行。不完全为true,但我明白你的意思。我的问题是-我可以构造问题中的代码来设置[[prototype]]上的构造函数属性吗是的,这就是我想要的。我想知道是否有一种方法可以避免“强烈劝阻”(根据Mozilla)object.setPrototypeOf
。我想没有。不会函数MyDto(){if(MyDto的这个实例)this.myProperty=null;else返回new MyDto;}
更好吗?我的拙见是,如果(!(MyDto的这个实例))
看起来很粗俗。此外,它还有一个额外的!
操作,这是不必要的。只是偏好问题。
function MyDto() {
if (!(this instanceof MyDto)) {
return new MyDto();
}
Object.assign(this, {myProperty: null});
}