我需要对对象实例化和继承进行一些澄清。请考虑以下代码和后续观察:
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
最近才添加到该语言中,它打算解决什么问题?
答案 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)
。