Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';我不能真正理解Javascript中构造函数和原型的关系_Javascript_Constructor_Prototype - Fatal编程技术网

Can';我不能真正理解Javascript中构造函数和原型的关系

Can';我不能真正理解Javascript中构造函数和原型的关系,javascript,constructor,prototype,Javascript,Constructor,Prototype,我是Javascript的初学者,在理解构造函数和原型属性之间的关系时遇到了困难 我知道Prototype对象有一个指向构造函数的构造函数属性。构造函数有一个prototype属性,指向prototype对象 以下是我试图理解的代码(我的问题在代码中有注释): 为什么要打印“汽车”对象?不是构造函数不是原型对象吗?为什么不打印原型对象 这就是Chrome(或您使用的浏览器)命名对象的方式。如果您仔细查看这些属性,它实际上是汽车。原型: 我正在尝试将构造函数中的prototype属性更改为“Ve

我是Javascript的初学者,在理解构造函数和原型属性之间的关系时遇到了困难

我知道Prototype对象有一个指向构造函数的
构造函数
属性。构造函数有一个
prototype
属性,指向prototype对象

以下是我试图理解的代码(我的问题在代码中有注释):

为什么要打印“汽车”对象?不是构造函数不是原型对象吗?为什么不打印原型对象

这就是Chrome(或您使用的浏览器)命名对象的方式。如果您仔细查看这些属性,它实际上是
汽车。原型

我正在尝试将构造函数中的prototype属性更改为“Vehicle”对象,这样做对吗

不能更改现有对象的原型,只能对其进行扩展。设置
Car.prototype=车辆
只会为
汽车的未来实例更改原型,现有的实例仍将引用原始原型对象,该对象没有
getName
属性:

// create a new instance after setting the new prototype
var myCar2 = new Car();
// yields false
console.log(Object.getPrototypeOf(myCar) === Object.getPrototypeOf(myCar2)); 

这实际上与原型无关,而与JavaScript中赋值和引用的工作方式无关。假设我有以下对象:

var foo = {
    bar: {
        answer: 42
    }
};
假设我将
foo.bar
分配给另一个对象的属性:

var baz = {};
baz.xyz = foo.bar;
现在将
foo.bar
设置为其他值,如
foo.bar={}
,不会更改
baz.xyz
的值,它仍然会引用以前的对象

只有扩展原始对象(扩展原型)或更改其属性才会产生效果,因为
foo.bar
baz.xyz
都引用同一对象:

foo.bar.answer = 21;
console.log(baz.xyz.answer); // shows 21
// console.log(foo.bar === baz.xyz); // yields true

构造函数
属性几乎毫无用处。它没有实际用途,可以被脚本覆盖,所以不可靠。你可能想看看这个:@JamesBlack谢谢,我来看看。
foo.bar.answer = 21;
console.log(baz.xyz.answer); // shows 21
// console.log(foo.bar === baz.xyz); // yields true