与JavaScript中的原型混淆 1.

与JavaScript中的原型混淆 1.,javascript,Javascript,我读了道格拉斯·克罗克福德的JavaScript好书。在本书中,方法被添加到函数中。原型 a b infactMyClass.method未定义 为什么步骤a是正确的,步骤b是错误的 2. 请解释如下: Object instanceof Function // true Function instanceof Object // true Object instanceof Object // true Function instanceof Function // t

我读了道格拉斯·克罗克福德的JavaScript好书。在本书中,
方法
被添加到
函数中。原型

a

b

infact
MyClass.method
未定义

为什么步骤a是正确的,步骤b是错误的

2. 请解释如下:

Object instanceof Function    // true
Function instanceof Object    // true
Object instanceof Object      // true
Function instanceof Function  // true
这很令人困惑。请用简单的话解释。

1.

01 Function.prototype.method = function foo() {}
02 Function.prototype.method === Function.method; // true
01 function MyClass() {}    
02 MyClass.prototype.method = function foo() {} // Named for clarity.
03 MyClass.prototype.method == MyClass.method // false 
04 // infact MyClass.method is undefined.
Object instanceof Function    // true

a) 您刚刚扩展了函数内置对象,现在函数的每个实例都附加了该属性,包括函数内置实例

b) 您刚刚用方法扩展了MyClass,现在MyClass的每个实例都附加了该方法。但是,MyClass不是MyClass的实例,因此该方法不存在

2.

01 Function.prototype.method = function foo() {}
02 Function.prototype.method === Function.method; // true
01 function MyClass() {}    
02 MyClass.prototype.method = function foo() {} // Named for clarity.
03 MyClass.prototype.method == MyClass.method // false 
04 // infact MyClass.method is undefined.
Object instanceof Function    // true
这些是语言中的标准内置对象。它们是可以返回实例的实例。关于对象,它的原型与所有事物共享,因为所有事物都源于对象——一般来说,最好避免更改它的原型

这就是为什么函数似乎是对象的一个实例。一切都很好。每个实例都源于函数,因此对象实例也是函数的实例。而事实恰恰相反

还有一整套其他基本对象,例如,对象不是数字的实例,但数字是对象和函数的实例

有关此列表的更多信息,请访问

下面显示的只是这些对象的一小部分,因为列表中包含一些很可能不感兴趣的对象(例如URIError)

  • 反对
  • 作用
  • 布尔值
  • 象征
  • 错误
  • 数学
  • 日期
  • 正则表达式
  • 排列
  • JSON
  • 允诺
    • 1a.

      01 Function.prototype.method = function foo() {}
      02 Function.prototype.method === Function.method; // true
      
      01 function MyClass() {}    
      02 MyClass.prototype.method = function foo() {} // Named for clarity.
      03 MyClass.prototype.method == MyClass.method // false 
      04 // infact MyClass.method is undefined.
      
      Object instanceof Function    // true
      
      这是向内置
      函数
      函数对象的
      原型
      属性所指向的对象添加的属性

      Function
      是名为“Function”的内置函数对象实例。
      函数
      因此是对象,因为函数是对象。 因为
      Function
      是一个函数,所以它具有
      prototype
      属性。在本例中,它是另一个函数对象

      上面的第1行向
      函数添加了一个名为
      method
      的属性。prototype
      将其指向函数对象
      foo
      (为清晰起见而命名)

      第2行测试
      函数.prototype.method
      (在第1行中创建)与试图获取内置
      函数
      函数对象上属性
      方法
      相关值的结果之间的引用相等性。JavaScript中的属性解析是通过搜索由原型链链接的对象链来执行的

      因此,在第2行
      Function.prototype.method
      中,由于
      method
      属性直接位于
      Function.prototype
      上,因此会立即查找属性

      同样在第2行,
      函数。在
      函数
      上找不到方法
      ;然后,通过查看
      函数所指向的内容来继续搜索。uuu proto_uuu
      属性(这称为原型链)。JavaScript中的
      \uuu proto\uu
      引用自动指向创建它的函数的
      prototype
      属性。在这种情况下,因为我们处于原型链的顶端(这是最顶端的函数)!),我们有一个不寻常的情况,即内置的
      函数
      “创建了自己”(实际上
      函数
      是由运行时本身创建的,在用户代码之外),这意味着
      原型
      原型
      属性(在本例中)都指向同一个对象

      因此,对
      方法的搜索遵循
      \uuuu proto\uuuu
      链接,找到
      函数.prototype
      指向的相同对象,并在那里找到属性
      方法。因此:

      02 Function.prototype.method === Function.method; // true
      
      1b.

      01 Function.prototype.method = function foo() {}
      02 Function.prototype.method === Function.method; // true
      
      01 function MyClass() {}    
      02 MyClass.prototype.method = function foo() {} // Named for clarity.
      03 MyClass.prototype.method == MyClass.method // false 
      04 // infact MyClass.method is undefined.
      
      Object instanceof Function    // true
      
      这是普通的userland代码,我们不必像1a中那样为最顶层的
      函数
      对象找到原型

      声明后(上面的第1行),
      MyClass
      会像每个函数一样获得一个
      prototype
      属性,指向一个空的对象实例

      第2行将属性
      方法
      添加到此空对象实例,并将其指向函数
      foo

      第3行测试
      foo
      和在
      MyClass
      上查找属性
      方法的结果之间的引用相等性。与前面一样,要在
      MyClass
      上查找
      method
      ,将执行搜索。它不直接存在于
      MyClass
      上,因此将检查位于属性
      \uuuu proto\uuu
      上的对象是否具有名为method的属性(同样,这是正在遍历的原型链)。在本例中,与1a(以及JavaScript中的每个对象)一样,
      \uuuuu proto\uuuu
      指向创建对象的函数的
      prototype
      属性。函数对象
      MyClass
      是由内置的
      Function
      函数对象创建的,因此
      MyClass.\uu proto\uuuu
      指向
      Function.prototype
      (注意,不是
      MyClass.prototype
      )。它在那里什么也找不到,并继续沿着原型链进行搜索。它最终无法找到名为
      method
      的属性,因此返回
      undefined

      因此:

      MyClass.prototype.method == MyClass.method // false
      
      2.

      01 Function.prototype.method = function foo() {}
      02 Function.prototype.method === Function.method; // true
      
      01 function MyClass() {}    
      02 MyClass.prototype.method = function foo() {} // Named for clarity.
      03 MyClass.prototype.method == MyClass.method // false 
      04 // infact MyClass.method is undefined.
      
      Object instanceof Function    // true
      
      对象是用于创建对象的内置构造函数对象。因此,它是一个函数


      instanceof
      是一个运算符,如果RHS对象的prototype属性位于LHS的prototype链上,则返回true。原型ch