什么'是Javascript中的'实例'?

lol*_*rup 8 javascript function object instance

这个问题的答案: JavaScript函数的原型属性的初始值是多少?

有这句话:

任何新创建的Function实例上的prototype的初始值是Object的新实例

据我所知,Javascript没有类,因此"实例"这个词在我脑海中没有意义.如何解释Javascript中的"实例"?

对不起,我没有足够的代表将我的问题放在答案的评论主题中.

Mik*_*uel 16

你是对的,JavaScript还没有类(但是),但它确实有构造函数,instanceof定义对象和构造函数之间关系的运算符,以及基于原型链的继承形式.

obj instanceof ctorctor.prototypeobj原型链上是真的.

模数下面的警告,你可以instanceof在EcmaScript 5中实现

function isInstanceOf(obj, ctor) {
  var proto = ctor.prototype;
  if (typeof obj === "object" || typeof obj === "function") {
    while (obj) {
      if (obj === proto) { return true; }
      obj = Object.getPrototypeOf(obj);
    }
  }
  return false;
}
Run Code Online (Sandbox Code Playgroud)

除非你去重新分配原型(o = new MyConstructor(); MyConstructor.prototype = somethingElse),否则应该是这样的new MyConstructor() instanceof MyConstructor.

15.3.5.3详细解释了这一点.

15.3.5.3 [[HasInstance]] (V)

假设F是一个Function对象.

当使用值V调用F的[[HasInstance]]内部方法时,将执行以下步骤:

  1. 如果V不是对象,则返回false.
  2. 设O是使用属性名称"prototype"调用F的[[Get]]内部方法的结果.
  3. 如果Type(O)不是Object,则抛出TypeError异常.
  4. 重复

    1. 设V是V的[[Prototype]]内部属性的值.
    2. 如果V为null,则返回false.
    3. 如果O和V引用同一个对象,则返回true.

这不是全部故事,因为允许宿主对象(如DOM节点)实现[[HasInstance]]内部方法,但他们喜欢但大多数浏览器实现主机对象的行为尽可能接近本机对象.


gil*_*ly3 5

JavaScript没有类,但它有类型.您可以使用new关键字定义自己的类型并创建新实例:

function Foo(initialValue) {
    this.value = initialValue || 0;
}
var foo = new Foo(17);
var fooIsAFoo = foo instanceof Foo;  // true!
var fooIsAnObject = foo instanceof Object; // also true!  We have inheritance here :)
Run Code Online (Sandbox Code Playgroud)