我创建了一个简单的类,如下所示:
var Class = function() {};
Class.prototype.testObj = {a:2, b:3};现在,如果我做console.log(Class.testObj),我会得到undefined。但如果我按如下方式创建该类的实例:
var instance = new Class();
console.log(instance.testObj)我得到了预期的输出。
在我的理解中,所有变量都被视为对象,并具有原型属性。当在对象中找不到某个键时,将遍历原型链以查找键值对。但是在Class的情况下,它不会遍历原型链。
我遗漏了什么?new关键字还做了哪些额外的工作,以使属性可访问?
发布于 2014-08-18 20:56:03
Class()是你的constructor,而不是instance object。所以Class.testObject将返回undefined,因为Class不具备可以将prototype看作是对象的配方的特性。几乎每个函数都有一个在创建新实例时使用的prototype属性,以及在所有对象之间共享instancesClass的实例对象,因此< 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
发布于 2014-08-18 20:49:36
无论何时创建对象,如函数,它都继承自对象构造函数,因此此
var Class = function() {};是一个对象,并且它有自己的prototype属性,可以使用
Class.prototype您可以使用以下命令在prototype对象上创建新属性
Class.prototype.testObj = {a:2, b:3};如果你想访问它,你实际上必须这样做
console.log(Class.prototype.testObj)因为它就是这样,所以在Class的prototype属性中添加了一个属性。
当您使用new关键字时,一些神奇的事情发生了,一个全新的对象被创建(称为实例),该对象从Class.prototype继承,从docs继承
当代码为新类(...)时
执行时,会发生以下情况:
创建一个新的对象,继承自Class.prototype.
this来调用类。new Class等同于new Class(),即如果没有指定参数列表,则在没有指定参数列表的情况下调用Class,而不调用构造函数返回的arguments.发布于 2014-08-18 20:58:46
您误解了Class和Class.prototype之间的关系。
Class是一个构造函数。严格地说,JavaScript不区分构造函数和通用函数,但现在这一点并不重要。Class.prototype是类实例的原型。也就是说,当您实例化类时- var x = new Class() - Class.prototype将作为委托对象附加到x。
这意味着对x的查找将沿着委托链向上传播,并引用该原型实例上的变量。
在我的理解中,所有变量都被视为对象,并具有原型属性。
这是不正确的。原型有许多原语类型,并且只有函数有一个名为‘JavaScript’的属性。原型委托仅在使用带有构造函数或ECMAScript 5 object.create()表示法的new创建时才附加到引用类型(对象、数组和函数)。
顺便说一句,Class确实有一个原型委托,因为它是Function()的一个实例。委托函数方法的一个实例是apply()。
https://stackoverflow.com/questions/25363551
复制相似问题