定义一个“;嵌套的“;JavaScript中的对象构造函数

Define a "nested" object constructor in JavaScript?

本文关键字:JavaScript 对象 构造函数 嵌套 一个 定义      更新时间:2023-09-26

是否可以在另一个对象中定义一个对象?我在想这样的事情:

function MyObj(name) {
    this.name = name;
    function EmbeddedObj(id) {
        this.id = id;
    }
}

然后我可以创建一个像这样的EmbeddedObj:

var myEmbeddedObj = new MyObj.EmbeddedObj();

奖励积分记忆:Objectception!:o

是,没有。

function MyObj(name) {
    this.name = name;
}
MyObj.EmbeddedObj = function EmbeddedObj(id) {
    this.id = id;
}
new MyObj.EmbeddedObj(42);

将运行,但可能不会产生"嵌入式对象"的预期结果(请参阅注释)。

注意,在new expr的情况下,表达式首先求值,因此,在这种情况下,它使用从MyObject.EmbeddedObj求值的函数对象作为构造函数来创建一个新对象。(表达式中有一条带括号的愚蠢规则,但那是另一回事。)


现在,如果想要"父母"answers"孩子"的关系,可以使用一种更全面的方法:

function Parent (name) {
   this.name = name;
   var parent = this; // for closure
   this.Child = function Child () {
      this.Parent = parent;
   }
}
// create new parent object
var parent = new Parent();       
// each new parent has a different Child constructor and
// any function-object can be used as a constructor
var child = new parent.Child();
// true: child is "bound" to parent
child.Parent === parent;
function MyObj(name) {
    this.name = name;
}
MyObj.EmbeddedObj = function(id) {
    this.id = id;
}
var myEmbeddedObj = new MyObj.EmbeddedObj();

这看起来像你想要的吗?

以下是嵌套构造函数的示例

function cimdb(name,review,year) {
 function nestedConstructor(name,review,year) {
    this.name = name;
    this.review = review;
    this.year = year
};
    this.name = name;
    this[name] = new nestedConstructor(name,review,year);
}

  var lionking = new cimdb("The Lion King", "The lion King review ..", 2015);

我想这就是您所说的嵌套对象构造函数的意思。

在构造函数中嵌套其他对象的最简单方法是创建其字段,然后在调用构造函数时创建一个新对象下面是一个例子:

function Product(name, price, category, producer) {
    this.name = name;
    this.price = price;
    this.category = category;
    // nested constructor
    this.producer = producer;
}
function Producer(contributor, address) {
    this.contributor = contributor;
    this.address = address;
}
let prod1 = new Product("Milk", 2.5, "Dairy", new Producer("Nestle", "Warszawa"));