javascript 原型 原型链继承

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MoveLikeRabbit/article/details/82926480
  1. 每个函数对象都有一个prototype属性,但普通对象没有prototype属性,prototype下面有一个constructor,指向这个函数

  2. 每个人对象有一个名为[[prototype]]的内部属性,指向所对应的构造函数的原型对象,原型链基于__proto__

  3. Object Function 互相继承对方,既是函数也是对象

  4. 属性查找

    在访问对象的某个成员的时候会先在对象中找是否存在
    如果当前对象中没有就在构造函数的原型对象中找
    如果原型对象中没有找到就到原型对象的原型上找
    直到                                                                                                                                                                                                                                                                                                                                                                                  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>
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MoveLikeRabbit/article/details/82926480
  1. 每个函数对象都有一个prototype属性,但普通对象没有prototype属性,prototype下面有一个constructor,指向这个函数

  2. 每个人对象有一个名为[[prototype]]的内部属性,指向所对应的构造函数的原型对象,原型链基于__proto__

  3. Object Function 互相继承对方,既是函数也是对象

  4. 属性查找

    在访问对象的某个成员的时候会先在对象中找是否存在
    如果当前对象中没有就在构造函数的原型对象中找
    如果原型对象中没有找到就到原型对象的原型上找
    直到                                                                                                                                                                                                                                                                                                                                                                                  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>

猜你喜欢

转载自blog.csdn.net/qq_16324421/article/details/82933526