Javascript Prototype和proto,哪种说法是正确的?

Javascript Prototype和proto,哪种说法是正确的?,javascript,prototype,Javascript,Prototype,我试图理解JavaScript中基于原型的继承。我读了很多书,在谷歌上搜索了几个小时。现在,我需要连接所有这些信息,希望你能帮助我 如果以下三种说法正确: JavaScript中的每个对象都有一个特殊的内部属性,我们可以通过访问它 所有构造函数都有一个匿名对象属性,我们可以通过.prototype访问该属性 实例对象的\uuu proto\uu属性指向其构造函数的prototype对象属性 让我们创建以下构造函数,它创建一个Dog对象: function Dog(name, color) {

我试图理解JavaScript中基于原型的继承。我读了很多书,在谷歌上搜索了几个小时。现在,我需要连接所有这些信息,希望你能帮助我

如果以下三种说法正确:

  • JavaScript中的每个对象都有一个特殊的内部属性,我们可以通过
    访问它
  • 所有构造函数都有一个匿名对象属性,我们可以通过
    .prototype
    访问该属性
  • 实例对象的
    \uuu proto\uu
    属性
    指向其构造函数的
    prototype
    对象属性
让我们创建以下构造函数,它创建一个Dog对象:

function Dog(name, color) {
  this.name = name;
  this.color = color;

  this.bark = function() {
    return `Bark, bark! My name is ${this.name}`;
  }
}
let mini = new Dog('mini', 'black');
现在,让我们创建一个对象的实例:

function Dog(name, color) {
  this.name = name;
  this.color = color;

  this.bark = function() {
    return `Bark, bark! My name is ${this.name}`;
  }
}
let mini = new Dog('mini', 'black');
如果现在打开控制台并返回mini,结果如下:

正如预期的那样,实例对象mini继承了其构造函数的所有属性和方法

但是这些继承的属性和方法都不在其
\uuuuu proto\uuuu
属性内。它们似乎都是直接继承给对象mini本身的

现在,让我们向构造函数的prototype对象添加一个新方法:

Dog.prototype.myBread = function() {
  return `My bread is ${this.bread}`;
}
如果现在在控制台中返回mini,我们将得到以下结果:

同样,正如预期的那样,新方法myBread被传递给我们的对象。但是这次它显示在我们的对象mini
\uuuuu proto\uuuu
中,它引用(指向)构造函数中的prototype对象属性

根据以上简单的实验,我假设如下:

  • 如果构造函数有自己的属性和方法,则它们不是其原型对象的一部分。这些属性和方法直接位于构造函数对象上

  • 但是如果我们向构造函数的
    .prototype
    添加属性或方法,它们就会被添加到它的prototype对象中。为了证明这一点,我们无法访问
    Dog.myBread()Dog.prototype.myBread()

  • 添加到构造函数的
    .prototype
    中的属性和方法会进入构造函数的prototype对象,并且由于实例对象的
    \uuuuuuuuuuuuuu
    引用了该prototype对象,因此我们可以在实例对象中访问它们

  • 如果构造函数有自己的属性和方法,则它们不在其原型对象内。这些属性和方法直接位于对象上,并自动传递给其所有实例。在这种情况下,
    \uuu proto\uu
    prototype属性不起任何作用,与继承过程无关

  • 现在,你能帮我看看我的假设是否正确吗?
    我对最后一个假设特别好奇。

    当您编写
    Dog.myBread()时
    您尝试不调用Dog的对象实例,而只调用对象(函数)Dog,就像编写
    Dog.myBread()时用另一种语言调用
    static
    字段一样您尝试不调用Dog的object instanceOf,而只调用object(function)Dog,就像另一种语言中的
    static
    字段一样

    JavaScript中的每个对象都有一个特殊的内部属性,我们可以通过
    \uuuuu proto\uuuuu

    不可以。每个JS对象都有一个内部[[prototype]]链接,我们可以通过
    object.getPrototypeOf()
    访问该链接
    \uuuu proto\uuuu
    已弃用,并非在所有对象上都可用

    所有构造函数都有一个匿名对象属性,我们可以通过
    .prototype
    访问该属性

    是的,所有的构造函数都有一个带有对象的
    .prototype
    属性,但我不知道为什么你会称之为“匿名”

    实例对象的[[prototype]]链接指向其构造函数的
    prototype
    对象属性

    不是属性,而是对象本身。如果重新分配
    Constructor.prototype=…
    ,则实例的[[prototype]]链接不会更改。该链接是使用当前值
    构造函数设置的。当您调用
    new
    时,prototype
    ,yes


    正如预期的那样,实例对象mini继承了其构造函数的所有属性和方法

    不,在第一个示例中没有继承。实例拥有
    树皮
    颜色
    名称
    属性。它们不属于构造函数,它们只是由实例上的构造函数代码创建的

  • 如果构造函数有自己的属性和方法,则它们不是其原型对象的一部分。这些属性和方法直接位于构造函数对象上
  • 是的,
    .prototype
    .name
    是位于构造函数对象本身的属性

    (注意,作为函数对象的每个构造函数都有一个指向
    function.prototype
    的[[prototype]]链接,但这在这里并不特别有趣)

  • 但是如果我们向构造函数的
    .prototype
    添加属性或方法,它们就会被添加到它的prototype对象中。为了证明这一点,我们无法访问
    Dog.myBread()Dog.prototype.myBread()
  • 这听起来像是真理,所以是的

  • 添加到构造函数的
    .prototype
    中的属性和方法会进入构造函数的prototype对象,因为实例对象的[[prototype]]引用了prototype对象,所以我们可以在