js中有万物皆对象的说法,而所有的对象都有原型,而原型的原型也有自己的原型。当一个对象在寻找自身的属性,方法时,就会先从自身的上去寻找,找不到就会在自身的原型上去寻找,这样一级一级寻找下去就会形成链式结构,这种结构叫做原型链。
《javascript高级程序设计》这样描述原型
每个函数都会创建一个prototype属性,这个属性是一个对象,包含应该由特定引用类型的实例共享的属性和方法。实际上,这个对象就是通过调用构造函数创建的对象的原型。使用原型对象的好处是,在它上面定义的属性和方法都可以被对象实例共享。原来在构造函数中直接赋给对象实例的值,可以直接赋值给它们的原型。
就拿构造函数来讲 每个实例对象(object)都有一个私有属性(称之为 **proto** )指向它的构造函数的原型对象(prototype)。该原型对象也有一个自己的原型对象(**proto**),层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。
<script>
/*
1.原型链 : 每一个实例对象都有自己的原型, 而原型也是对象,也有自己的原型。以此类推,形成链式结构,称之为原型链。
2.对象访问原型链规则 : 就近原则
* 对象先访问自己的成员,自己没有找原型,原型也没有就找原型的原型,以此类推。直到原型链终点(null),如果还是找不到。 属性则获取undefined , 方法则报错 xxx is not function
3.经典面试题:
3.1 原型链作用 : 继承
3.2 js如何实现面向对象继承 : 原型链
*/
//查看内置对象原型链
let arr = [10,20,30]
console.log(arr)
//(1)查看arr的原型
console.log( arr.__proto__.constructor )//Array
console.log( arr.__proto__ === Array.prototype )//true
//(2)查看arr的原型的原型
console.log( arr.__proto__.__proto__.constructor )//Object
console.log( arr.__proto__.__proto__ === Object.prototype )//true
//字符串原型链
let str = new String('abc')
console.log( str )
//查看str的原型
console.log( str.__proto__.constructor ) //String
console.log( str.__proto__ === String.prototype )//true
//查看str的原型的原型
console.log( str.__proto__.__proto__.constructor )//Object
console.log( str.__proto__.__proto__ === Object.prototype )//true
</script>
</body>
</html>