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

Javascript 在对象上正确设置原型构造函数,javascript,Javascript,我有一个DTO类型,它实际上是键/值对的映射。为了简洁起见,我通常会使用对象文本,但这会将结果对象的[[prototype]].constructor设置为有意义的值 e、 g 是否有类似的方法,但将[[prototype]].constructor属性设置为更有意义的MyDto(而不是Object) o.constructor = MyDto; 这将把o的构造函数设置为MyDto,但在执行o MyDto的instanceof时没有效果 如果这是您想要的,我建议您实例化MyDto: funct

我有一个DTO类型,它实际上是键/值对的映射。为了简洁起见,我通常会使用对象文本,但这会将结果对象的
[[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});
}