首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript:了解原型链

Javascript:了解原型链
EN

Stack Overflow用户
提问于 2014-08-18 20:40:29
回答 5查看 492关注 0票数 3

我创建了一个简单的类,如下所示:

代码语言:javascript
复制
var Class = function() {};
Class.prototype.testObj = {a:2, b:3};

现在,如果我做console.log(Class.testObj),我会得到undefined。但如果我按如下方式创建该类的实例:

代码语言:javascript
复制
var instance = new Class();
console.log(instance.testObj)

我得到了预期的输出。

在我的理解中,所有变量都被视为对象,并具有原型属性。当在对象中找不到某个键时,将遍历原型链以查找键值对。但是在Class的情况下,它不会遍历原型链。

我遗漏了什么?new关键字还做了哪些额外的工作,以使属性可访问?

EN

回答 5

Stack Overflow用户

发布于 2014-08-18 20:56:03

  1. 你必须清楚Class()是你的constructor,而不是instance object。所以Class.testObject将返回undefined,因为Class不具备可以将prototype看作是对象的配方的特性。几乎每个函数都有一个在创建新实例时使用的prototype属性,以及在所有对象之间共享instances
  2. A 的属性instances
  3. A构造函数只是一个与一起用于创建对象的函数
  4. 执行此操作时,它意味着您正在创建Class的实例对象,因此< var instance = new Class(); >D27Class>将继承D28属性

Console.log( console.log(Class.prototype.isPrototypeOf(instance));的实例);// => true console.log(Class.prototype.isPrototypeOf(instance));(instance.constructor ===类);// => true instance // => true instanceof Class // => true

票数 2
EN

Stack Overflow用户

发布于 2014-08-18 20:49:36

无论何时创建对象,如函数,它都继承自对象构造函数,因此此

代码语言:javascript
复制
var Class = function() {};

是一个对象,并且它有自己的prototype属性,可以使用

代码语言:javascript
复制
Class.prototype

您可以使用以下命令在prototype对象上创建新属性

代码语言:javascript
复制
Class.prototype.testObj = {a:2, b:3};

如果你想访问它,你实际上必须这样做

代码语言:javascript
复制
console.log(Class.prototype.testObj)

因为它就是这样,所以在Classprototype属性中添加了一个属性。

当您使用new关键字时,一些神奇的事情发生了,一个全新的对象被创建(称为实例),该对象从Class.prototype继承,从docs继承

当代码为新类(...)时

执行时,会发生以下情况:

创建一个新的对象,继承自Class.prototype.

  • The构造函数的
  1. 使用指定的参数和绑定到新创建的对象的this来调用类。new Class等同于new Class(),即如果没有指定参数列表,则在没有指定参数列表的情况下调用Class,而不调用构造函数返回的arguments.
  2. The对象成为整个新表达式的结果。如果构造函数没有显式返回对象,则使用在步骤1中创建的对象。(通常构造函数不返回值,但如果它们想覆盖正常的对象创建过程,则可以选择返回值。)
票数 1
EN

Stack Overflow用户

发布于 2014-08-18 20:58:46

您误解了ClassClass.prototype之间的关系。

Class是一个构造函数。严格地说,JavaScript不区分构造函数和通用函数,但现在这一点并不重要。Class.prototype是类实例的原型。也就是说,当您实例化类时- var x = new Class() - Class.prototype将作为委托对象附加到x

这意味着对x的查找将沿着委托链向上传播,并引用该原型实例上的变量。

在我的理解中,所有变量都被视为对象,并具有原型属性。

这是不正确的。原型有许多原语类型,并且只有函数有一个名为‘JavaScript’的属性。原型委托仅在使用带有构造函数或ECMAScript 5 object.create()表示法的new创建时才附加到引用类型(对象、数组和函数)。

顺便说一句,Class确实有一个原型委托,因为它是Function()的一个实例。委托函数方法的一个实例是apply()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25363551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档