Javascript中的新关键字,新的Object()和Object.create()

时间:2017-09-28 07:48:44

标签: javascript object inheritance prototype prototypal-inheritance

我需要对对象实例化和继承进行一些澄清。请考虑以下代码和后续观察:

function TestObject() {
  this.TestProperty1 = "TestProperty1";
  this.TestFunction1 = function() {
    console.log(this.TestProperty1);
  }
}

TestObject.prototype.TestProperty2 = "TestProperty2";
TestObject.prototype.TestFunction2 = function() {
  console.log(this.TestProperty2);
}

new关键字

let TestInstance1 = new TestObject();
console.log(TestInstance1);

根据我的OOP经验,输出正是我所期望的。 TestInstance1属于TestObject类型,可以访问其成员及其原型成员。

new Object()

let TestInstance2 = new Object(TestObject.prototype);
console.log(TestInstance2);

输出表明TestInstance2属于Object类型,而不是TestObject但是它会获得引用constructor的{​​{1}}属性。它只能访问TestObject的原型成员。

TestObject

Object.create()

输出表明let TestInstance3 = Object.create(TestObject.prototype); console.log(TestInstance3); 属于TestInstance3类型,但它只能访问其原型成员。

问题

为什么要使用TestObject方法而不是new Object()关键字方法?返回new实例并引用传递给其构造函数的类型而不是简单地返回类型本身的实例似乎很奇怪。

标准第一版中的Object关键字方法是否与new方法一样?我的印象是之后添加,因为我认为没有理由使用new Object()方法而不是new Object()关键字方法。

由于new最近才添加到该语言中,它打算解决什么问题?

2 个答案:

答案 0 :(得分:0)

以下一行:

TestObject.prototype.TestProperty2 = "TestProperty2";

修改所有TestObject个实例,这通常不是您要实现的目标。

Object.create()方法用于实现经典继承。 如:

EnchancedTestObject.prototype = Object.create(TestObject.prototype);

因此,您不是直接从TestObject继承,而是使用指定的原型从Object继承。对其所做的任何更改都不会影响最初的更改。

EnchancedTestObject.prototype = new TestObject();

您通常也不想在此处创建新的TestObject实例。如果TestObject预期参数会发生什么?你会通过哪一个?如果调用TestObject构造函数有副作用怎么办?

解决方案是将TestObject.prototype连接到原型链中。

答案 1 :(得分:0)

  

new TestObject();正如我的OOP经验所期望的那样。

是。你应该使用它,只有那个。

  

new Object(TestObject.prototype);是Object类型而不是TestObject,但是它获取了一个引用TestObject的构造函数属性。它只能访问TestObject的原型成员。

不完全是。 TestObject的原型对象,这就是它具有.constructor属性和其他成员的原因。当您使用new Object作为参数时,它实际上创建 new 对象,它只返回参数。你的TestInstance2 === TestObject.prototype

  

Object.create(TestObject.prototype);属于TestObject类型,但它只能访问其原型成员。

是。与new不同,它不运行构造函数来初始化实例。

  

为什么要使用new Object()方法而不是new关键字方法?

没有理由使用new Object。应该始终使用和对象文字来构造空对象,或者只是简单地Object(x)(没有new)将x转换为对象(如果它不是已经存在的那个)。

  

标准第一版中的new关键字方法是否与new Object()方法一样?

是的,它一直都是这样的。

  

由于Object.create()最近才添加到该语言中,它打算解决什么问题?

在不运行函数的情况下获得原型继承。这对于很多事情都很有用,比如为类创建原型继承链或克隆对象。它还允许我们通过调用Object.prototype来构造没有原型的对象(不继承任何内容),类似于Object.create(null)