【问题标题】:How do custom objects inherit from Javascript Object自定义对象如何从 Javascript 对象继承
【发布时间】:2016-09-11 04:23:44
【问题描述】:

自定义创建的对象如何访问.toString()等方法 方法,它是一个对象方法。自定义类如何链接到 Object

This 文章状态

所有对象最终在其末尾都有 Object 构造函数 原型链。这意味着添加到 对象属性自动对所有对象可用。

在前面的例子中,如果我们调用了 rufus.toString(),javascript 会检查 rufus 对象,然后是 Cat 对象,然后是 Pet 目的。 Pet 对象的原型是使用 Object 创建的 构造函数(使用对象文字快捷方式)所以javascript会 然后在 Object 的原型上找到 toString() 方法

现在通读这篇文章后,我了解到为了从对象继承,我们必须在对象的函数构造函数的原型中指定我们想要继承的对象。现在我读到默认情况下原型属性为空。那么对象如何具有属性 toString() ?我不明白这个说法

Pet 对象的原型是使用 Object 构造函数创建的 (使用对象文字快捷方式)

更新:

我读到构造函数的原型属性默认为空。我读到 here 我已经把引用贴在这里了

首先,每个 JavaScript 函数都有一个原型属性(这个 属性默认为空),并且您附加属性和方法 当你想实现继承时,在这个原型属性上。

那么我们如何继承javascript对象呢?

【问题讨论】:

  • 现在我读到,prototype 属性默认为空。 你从哪里读到的?请注意,对象的原型与原型属性(通常与构造函数相关联)相同。
  • @torazaburo 你能解释一下吗?你能解释一下对象的原型和原型属性之间的区别吗?我想我正在混合它们..
  • 是的,我也认为你是。网上有比我在一段中给出的更好的解释。搜索“原型和__proto__ 之间的差异”或类似的内容。

标签: javascript


【解决方案1】:

所有对象都通过原型继承继承Object 的属性。如果你这样做:

var b = {};
console.log(b.__proto__)

你可以看到继承自Object的所有属性。

所以,当你执行b.toString() 时,它会在b 上查找toString() 函数,然后它会继续沿着原型链向上,最终到达具有此函数的Object

编辑:

函数构造函数与对象:

澄清一下,函数构造函数定义如下:

var a = function() {
   this.b = "b";
   this.c = "c";
}

将其原型设置为function。这可以通过console.log(a) 来验证。

但是,我们使用a 来创建新的对象,如下所示:

var d = new a();

这些对象的原型设置为Object,同样,可以通过console.log(d) 进行验证。

更多详情here.

【讨论】:

  • 我读到 proto 属性是对原型属性的引用,除非明确指定,否则原型属性默认为空。那么自定义对象如何隐式继承 Object 呢?
  • 你在哪里读到的?详细了解请参考developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
  • 构造函数的原型属性,而不是对象。这是两个不同的东西。
  • 你能发布一个链接来解释差异吗?
【解决方案2】:

参考 JavaScript The Definitive Guide:

由对象字面量创建的所有对象,即{},都有相同的原型对象,我们可以在JavaScript代码中将这个原型对象称为Object.prototype。使用new 关键字和构造函数调用创建的对象使用构造函数的prototype 属性值作为其原型。所以new Object()创建的对象继承自Object.prototype,就像{}创建的对象一样。同样,new Array()创建的对象使用Array.prototype作为原型,new Date()创建的对象使用Date.prototype作为原型。

因此,所有使用{} 字面量创建的对象都将以Object.prototype 作为其原型,并且可以访问Object.prototype 定义的方法,例如toString() 等。

new 运算符用于创建和初始化新对象。 new 关键字必须与函数调用一起使用。当函数调用与new 关键字一起使用时,它被称为构造函数调用。

使用new 创建的对象和函数调用将从构造函数的prototype 属性继承。因此,使用new Date() 创建的对象将继承自Date.prototype,使用new Array() 创建的对象将继承自Array.prototype

您可以更改此prototype 属性以使对象继承自您自己的自定义对象。例如

function myFunction() {
    this.name = 'a';
    this.age = 20;
}

myFunction.prototype = {
    toString: function() {
        // you can override default toString() method here..
    },

    // you can define as many functions here as you want.
};

var myObj = new myFunction();

对象myObj 将从myFunction.prototype 继承,并且此对象中定义的所有方法都将可用于myObj

EcmaScript5 定义了一个新方法Object.create() 用于创建具有除Object.prototype 之外的原型的对象。例如

var prototypeObject = {a: 1, b: 2, c: 3};
var obj1 = Object.create(prototypeObject);

现在是obj1' will inherit fromprototypeObject' 而不是来自Object.prototype

【讨论】:

    【解决方案3】:

    你问

    自定义创建的对象如何访问诸如 .toString() 方法,它是一个 Object 方法。自定义类如何 链接到一个对象

    从阅读您发布的内容来看,您似乎已经过分思考了。你得到它,然后你ungot它。在不包含任何代码的情况下回答问题。

    在编程中,所有对象都继承自默认对象。把它想象成 JavaScripts 模板,它必须从一些东西开始,它有基本的属性和方法,你在此之上构建。每个对象都有不同的基本属性。 我在之前的帖子中说过原型链到此结束,但这并不完全准确,因为原型链以 null 结尾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      • 2011-06-12
      • 2012-01-31
      • 1970-01-01
      • 2015-09-30
      相关资源
      最近更新 更多