<!DOCTYPE html>
<html>
<head>
<title>js原型链</title>
<script type="text/javascript">
var a = function()
{
this.name = "普通对象的名称a";
};
a.prototype.name = "原型对象的名称a";
var a1= new a();
console.info(a.prototype);//a对象函数的原型对象打印出来是Object
console.info(a);
console.info(Object.prototype);
var b = function()
{
this.name = "普通对象的名称b";
this.id = "b";
}
b.prototype.name = "原型对象的名称b";
b.prototype.id = "b-prototype";
/*
* 普通对象
最普通的对象:有__proto__属性(指向其原型链),没有prototype属性。
原型对象(person.prototype 原型对象还有constructor属性(指向构造函数对象))
函数对象:
凡是通过new Function()创建的都是函数对象。
拥有__proto__、prototype属性(指向原型对象)。
Function、Object、Array、Date、String、自定义函数
特例: Function.prototype(是原型对象,却是函数对象,)
var o1 = {};
var o2 =new Object();
var o3 = new f1();
function f1(){};
var f2 = function(){};
var f3 = new Function('str','console.log(str)');
console.log(typeof Object); //function
console.log(typeof Function); //function
console.log(typeof f1); //function
console.log(typeof f2); //function
console.log(typeof f3); //function
console.log(typeof o1); //object
console.log(typeof o2); //object
console.log(typeof o3); //object
作者:Yi罐可乐
链接:http://www.jianshu.com/p/dee9f8b14771
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*
*/
a.prototype = new b();//另b的一个对象实例等于a对象函数的原型对象(即a的原型对象指向b的一个普通的实例对象),及原型链
//([proto]属性是JavaScript内部维护的,外部是不可访问的,由这个属性所维护的原型链为内部原型链,与由prototype和constructor维护的外部原型链)
//如下
//注意:每个实例都是原型对象的复制,当查找属性时,现在当前对象下选择,找不到会找到原型对象,原型对象找不到会继续到内部链 的_proto_中找,一直找到object中
//a.prototype=>b的一个实例,,b的实例指向b的原型,然后b的原型指向object的原型,依次内推。
console.info(a.prototype.__proto__.__proto__.toString());
console.info("--------分割线----------------");
console.info(new a().name);//找属性时,先找当前对象中找,找不到然后到原型中找。//普通对象的名称a
console.info(a.prototype.name);//由于a的原型链指向了b的一个对象实例,所以输出的为“普通对象的名称b”
console.info(a.prototype.id);//由于a的原型链指向了b的一个对象实例,所以输出的为“b”
console.info(new a().id);//由于a的原型链指向了b的一个对象实例,所以普通对象输出的跟原型对象的一致为b
</script>
</head>
<body>
</body>
</html>
js原型链
最新推荐文章于 2025-04-15 21:07:53 发布