【发布时间】:2015-03-06 04:30:32
【问题描述】:
我正在尝试理解 Javascript 中的继承。
我知道每个对象都有一个原型,它是它继承属性的对象。我知道.prototype属性只存在于函数上,当它被用作构造函数时,它是被设置为从这个函数创建的对象的原型的对象。
我知道,虽然有些浏览器支持__proto__ 属性,但对象的原型是无法访问的。 (但由于它不是语言的“经典”部分,我想了解如何在没有它的情况下使用该语言)。
如果所有这些都是正确的 (?),我想了解定义继承链的标准方法是什么。
我能想到的唯一方法是:
我希望它们从另一个对象继承的所有对象,必须通过构造函数创建。他们的“基础对象”将被设置为其构造函数的.prototype。
当我希望其中一个成为其他对象的“基础对象”时,我会将其设置为另一个构造函数的.prototype。以此类推。
这看起来很奇怪。有没有办法(在“普通”JS中)直接设置对象的“基础”?还是我必须以上述方式使用构造函数才能创建继承链?
创建继承的“标准”方式是什么?我描述的方法是标准方法吗?
【问题讨论】:
-
你可以使用
Object.create() -
@PM77-1
Object.create可以继承但可以创建链吗?也就是说,它可以 Object.create 一个 object.created 对象吗?因为据我所知,对象本身没有原型。只有构造函数(函数)可以。 -
@slebetman 原型是对象。阅读以下答案以了解 JavaScript 中的原型继承是如何工作的:stackoverflow.com/a/8096017/783743
-
@AaditMShah:原型是对象,但只有函数才有原型(一种称为“原型”的属性,其行为类似于原型)。尝试将原型属性添加到常规对象只会添加名称为“原型”的属性。它们不会以同样的方式被继承。
-
@slebetman 你不明白这一点。您可以使用
Object.create创建原型实例,而无需构造函数。例如:var a = {}; var b = Object.create(a); var c = Object.create(b); var d = Object.create(c);。这里我使用Object.create创建了一个原型链,其中d -> c -> b -> a -> Object.prototype -> null(即d继承自c,b继承自a,a继承自Object.prototype,后者继承自null) .函数有一个prototype属性,但所有对象都有一个特殊的[[prototype]]属性
标签: javascript inheritance prototype