【发布时间】:2017-12-15 11:08:06
【问题描述】:
我试图了解关键字new 和Object.create() 之间的真正区别
说明:
-
a1是function而a2是object -
a1和a2将key1作为默认属性。在从它们创建实例bxx之后分配key2。检查bxx是独立对象本身还是只是一个引用。
"use strict";
function a1() {
this.key1 = "value 1";
}
let a2 = {
key1: "value 1"
};
let b1new, b1obj, b2new, b2obj;
try {
b1obj = Object.create(a1);
} catch (e) {
console.error("Error a1: ", e.message)
}
try {
b1new = new a1();
} catch (e) {
console.error("Error a1: ", e.message)
}
try {
b2obj = Object.create(a2);
} catch (e) {
console.error("Error a2: ", e.message)
}
try {
b2new = new a2();
} catch (e) {
console.error("Error a2: ", e.message)
}
//let b = new a();
a1.key2 = "value 2";
a2.key2 = "value 2";
if (b1obj) {
console.log("b1obj.key1: ", b1obj.key1);
console.log("b1obj.key2: ", b1obj.key2);
}
if (b1new) {
console.log("b1new.key1: ", b1new.key1);
console.log("b1new.key2: ", b1new.key2);
}
if (b2obj) {
console.log("b2obj.key1: ", b2obj.key1);
console.log("b2obj.key2: ", b2obj.key2);
}
if (b2new) {
console.log("b2new.key1: ", b2new.key1);
console.log("b2new.key2: ", b2new.key2);
}
输出:
"Error a2: " "a2 is not a constructor"
"b1obj.key1: " undefined
"b1obj.key2: " "value 2"
"b1new.key1: " "value 1"
"b1new.key2: " undefined
"b2obj.key1: " "value 1"
"b2obj.key2: " "value 2"
问题:
- 为什么不能在 a2 上使用
new? - 为什么
b1obj.key1是undefined? - 为什么
b2obj.key2仍然是指父母的财产?
【问题讨论】:
-
你可以在类上使用
new,比如function ClassName(){},而a2只是一个变量 -
Object.create 中使用的对象实际上形成了新对象的原型,而在 new Function() 中,声明的属性/函数不形成原型。
-
一次问 1 个问题可能更容易,或者至少将您的片段分成单独的片段,只包含您提出的问题。反正
new和Object.create是不一样的。有很大的不同。 -
@Keith 哇,多么棒的建议和解释。所以根据你的建议,我应该创建3个问题,粘贴相同的代码块并猜猜是什么;我应该得到一个答案'有很大的不同,但不知道是什么'?
-
@AmitShah 是的,因为目前你的问题需要我上下滚动,不断找出你在说什么。如果每个问题和 sn-p 和结果都在一起,那就太好了。它只是让人们更容易提供帮助。例如。第一个问题,我必须找出你是否定义了 a2,然后当你调用 new 时,当然还有问题本身,IOW:上下 3 个位置,1 个问题。最重要的是,还有另外 2 个问题。希望这是有道理的,不要尝试,但对我来说,仅仅因为它的布局,你的问题很难回答。
标签: javascript oop inheritance