与JavaScript中的原型混淆 1.
我读了道格拉斯·克罗克福德的JavaScript好书。在本书中,与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
方法
被添加到函数中。原型
a
b
infactMyClass.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