-
每个函数对象都有一个prototype属性,但普通对象没有prototype属性,prototype下面有一个constructor,指向这个函数
-
每个人对象有一个名为[[prototype]]的内部属性,指向所对应的构造函数的原型对象,原型链基于
__proto__
-
Object Function 互相继承对方,既是函数也是对象
-
属性查找
在访问对象的某个成员的时候会先在对象中找是否存在 如果当前对象中没有就在构造函数的原型对象中找 如果原型对象中没有找到就到原型对象的原型上找 直到 Object的原型对象的原型是null为止
- 1
- 2
- 3
- 4
原型链:
谈到继承时,JavaScript 只有一种结构:对象。每个实例对象(object )都有一个私有属性(称之为 proto)指向它的原型对象(prototype)。该原型对象也有一个自己的原型对象 ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。
JavaScript instanceof 运算符代码
instanceof 运算符用于测试prototype属性是否出现在对象原型链中的任何位置
function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
var O = R.prototype;// 取 R 的显示原型
L = L.__proto__;// 取 L 的隐式原型
while (true) {
if (L === null)
return false;
if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true
return true;
L = L.__proto__;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
继承
// Car.prototype.constructor = Car // Car.__proto__ = Function.prototype // Function.__proto__ = Function.prototype // Object.__proto__ === Function.prototype // Object.__proto__.__proto__ === Object.prototype // Object.prototype.__proto__ = null
<span class="token keyword">function</span> <span class="token function">Car</span><span class="token punctuation">(</span>color<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>color <span class="token operator">=</span> color<span class="token punctuation">;</span> <span class="token punctuation">}</span> Car<span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">go</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>color<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token constant">BMW</span><span class="token punctuation">(</span>color<span class="token punctuation">)</span> <span class="token punctuation">{</span> Car<span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">,</span> color<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// 可能会改变父类原型</span> <span class="token comment">// BMW.prototype = Car.prototype </span> <span class="token comment">// call 和 new 会使Car的构造函数执行两遍 </span> <span class="token comment">// BMW.prototype = new Car()</span> _proto <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>Car<span class="token punctuation">.</span>prototype<span class="token punctuation">)</span><span class="token punctuation">;</span> _proto<span class="token punctuation">.</span>constructor <span class="token operator">=</span> <span class="token constant">BMW</span><span class="token punctuation">;</span> <span class="token constant">BMW</span><span class="token punctuation">.</span>prototype <span class="token operator">=</span> _proto<span class="token punctuation">;</span> <span class="token comment">// 先继承,在给原型上加BMW的方法</span> <span class="token constant">BMW</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">come</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'come'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">var</span> nss <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Car</span><span class="token punctuation">(</span><span class="token string">'blue'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// nss.__proto__ = Car.prototype</span> <span class="token keyword">var</span> wss <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BMW</span><span class="token punctuation">(</span><span class="token string">'red'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">dir</span><span class="token punctuation">(</span>Car<span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">dir</span><span class="token punctuation">(</span><span class="token constant">BMW</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'nss'</span><span class="token punctuation">,</span> nss<span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'wss'</span><span class="token punctuation">,</span> wss<span class="token punctuation">)</span><span class="token punctuation">;</span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-8cccb36679.css" rel="stylesheet">
</div>
-
每个函数对象都有一个prototype属性,但普通对象没有prototype属性,prototype下面有一个constructor,指向这个函数
-
每个人对象有一个名为[[prototype]]的内部属性,指向所对应的构造函数的原型对象,原型链基于
__proto__
-
Object Function 互相继承对方,既是函数也是对象
-
属性查找
在访问对象的某个成员的时候会先在对象中找是否存在 如果当前对象中没有就在构造函数的原型对象中找 如果原型对象中没有找到就到原型对象的原型上找 直到 Object的原型对象的原型是null为止
- 1
- 2
- 3
- 4
原型链:
谈到继承时,JavaScript 只有一种结构:对象。每个实例对象(object )都有一个私有属性(称之为 proto)指向它的原型对象(prototype)。该原型对象也有一个自己的原型对象 ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。
JavaScript instanceof 运算符代码
instanceof 运算符用于测试prototype属性是否出现在对象原型链中的任何位置
function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
var O = R.prototype;// 取 R 的显示原型
L = L.__proto__;// 取 L 的隐式原型
while (true) {
if (L === null)
return false;
if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true
return true;
L = L.__proto__;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
继承
// Car.prototype.constructor = Car // Car.__proto__ = Function.prototype // Function.__proto__ = Function.prototype // Object.__proto__ === Function.prototype // Object.__proto__.__proto__ === Object.prototype // Object.prototype.__proto__ = null
<span class="token keyword">function</span> <span class="token function">Car</span><span class="token punctuation">(</span>color<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>color <span class="token operator">=</span> color<span class="token punctuation">;</span> <span class="token punctuation">}</span> Car<span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">go</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>color<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token constant">BMW</span><span class="token punctuation">(</span>color<span class="token punctuation">)</span> <span class="token punctuation">{</span> Car<span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">,</span> color<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// 可能会改变父类原型</span> <span class="token comment">// BMW.prototype = Car.prototype </span> <span class="token comment">// call 和 new 会使Car的构造函数执行两遍 </span> <span class="token comment">// BMW.prototype = new Car()</span> _proto <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>Car<span class="token punctuation">.</span>prototype<span class="token punctuation">)</span><span class="token punctuation">;</span> _proto<span class="token punctuation">.</span>constructor <span class="token operator">=</span> <span class="token constant">BMW</span><span class="token punctuation">;</span> <span class="token constant">BMW</span><span class="token punctuation">.</span>prototype <span class="token operator">=</span> _proto<span class="token punctuation">;</span> <span class="token comment">// 先继承,在给原型上加BMW的方法</span> <span class="token constant">BMW</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">come</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'come'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">var</span> nss <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Car</span><span class="token punctuation">(</span><span class="token string">'blue'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// nss.__proto__ = Car.prototype</span> <span class="token keyword">var</span> wss <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BMW</span><span class="token punctuation">(</span><span class="token string">'red'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">dir</span><span class="token punctuation">(</span>Car<span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">dir</span><span class="token punctuation">(</span><span class="token constant">BMW</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'nss'</span><span class="token punctuation">,</span> nss<span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'wss'</span><span class="token punctuation">,</span> wss<span class="token punctuation">)</span><span class="token punctuation">;</span>