在对象上正确设置原型构造函数
Set the prototype constructor correctly on an object
我有一个DTO类型,它实际上是键/值对的映射。为了简洁起见,我通常会为此使用对象文字,但这预示着将[[prototype]].constructor
设置为有意义的值的结果对象。
例如
function MyDto() {
var o = {
myProperty: null
};
return o; //[[prototype]].constructor is meaningless
}
有没有办法做类似的事情,但将 [[prototype]].constructor
属性设置为更有意义的MyDto
(而不是Object
)?
不太确定你想做什么。但这可能会有所帮助..
function MyDto() {
var o = {
myProperty: null
};
Object.setPrototypeOf(o,MyDto.prototype);
return o;
}
a = MyDto();
console.log(a);
为了使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
属性在内部没有任何意义,仅对使用代码的开发人员有意义。
我想我不明白你的问题,但你可以试试这个:
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
错误的方向接近这个。如果您希望new Class()
的结果是真正的instanceof Class
,只需扩展默认实例对象,而不是创建并返回一个新对象。
function Class () {
_.extend(this, {
property: 'value',
// ...
});
}
(上面的代码使用Lo-Dash函数_.extend()
来保持你的代码简短和甜蜜。类似的实现可以在几乎所有实用程序库或更大的 JavaScript 框架中找到)。
- 用javascript为预定义对象设置原型
- 在Javascript中设置没有__proto__的函数的原型
- 从设置为原型的对象调用属性
- Javascript-从函数内部设置原型
- JS原型无法设置属性'moveRight'的未定义
- Javascript设置&阴影属性(原型链)
- 正在对通过object.create创建的对象设置原型
- JavaScript在一行中设置了命名函数的原型
- 在for循环中设置断点会导致在数组上使用原型时出错
- 在原型.js中设置原型值失败
- 业务催化剂原型核心.ashx 拒绝设置不安全的标头“连接”冲突
- 如何正确设置原型
- JavaScript - 为什么设置原型原型不起作用
- 在对象上正确设置原型构造函数
- 为什么要设置原型's构造函数转换为其构造函数函数
- 在函数构造函数中设置原型
- 当我不知道构造函数的名字时,如何设置原型呢?
- 创建对象后设置原型属性的可移植方法是什么?
- 设置原型's对象's字段更改所有实例
- 在Javascript中,为什么在构造函数上设置原型函数会改变其实例上的构造函数值