Javascript:使用链调用new实例化对象

时间:2019-04-01 16:32:57

标签: javascript class instantiation

是否可以使用链调用new实例化一个对象?

我正在阅读做到这一点的源代码,但是这非常令人困惑。

var SomeObject = function() {};
SomeObject.new.Sometask;

任何方向将不胜感激。

2 个答案:

答案 0 :(得分:2)

要回答您的问题:是的,您可以这样做。我不知道为什么为什么可能要这样做,但是由于Javascript非常灵活,因此可以做大多数事情。也许有一个有趣的用例。

您可以在new上使SomeObject成为一种吸气功能,然后在您访问new时返回一个新实例化的对象:

var SomeObject = function() {
    this.name = "Test"
};
// defined new getter
Object.defineProperty(SomeObject, "new", {
    get: function my_new() {
        return new SomeObject()
    }
});

// add Sometask
SomeObject.prototype.Sometask = function(){
    console.log("name:", this.name)
    return this // to allow more chaining
}

SomeObject.new.Sometask();

答案 1 :(得分:1)

您的示例中的OOP有点差。它看起来像是将传统的函数式编程与JavaScript以及实际OOP的元素进行了融合。在讨论JavaScript中的对象实例化时,为清楚起见,我将参考Mozilla在此处概述的语法:https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object-oriented_JS

关于您的问题,您可以在实例化对象之后链接方法,就像可以立即检索该新实例化的对象的属性一样。

var person1 = new Person('Bob');
console.log(person1.name);

或在实例化后立即获取属性:

console.log((new Person('Bob')).name);

可以使用以下方法完成此操作:

var person2 = new Person('Bob', 23);
console.log(person2.getAge());

或在实例化后立即调用该方法:

console.log((new Person('Bob', 23)).getAge());