js 原型链,原型继承
1. 原型链
注意:这是两个下划线,后面是五个字符的 “proto” ,后面再跟两个下划线
函数(Function)才有prototype
属性,prototype
是一个对象;
对象(除Object)拥有__proto__
,指向父类的原型(指向创建该对象的函数的prototype),proto是对象和对象之间连接的桥梁,即是原型链 ;
原型链的顶层就是Object.prototype,而这个对象的是没有原型对象的;
实例的构造函数属性(constructor)指向指向构造函数:
<script type="text/javascript">
function Person(){
};
var person1=new Person();
console.log(Person.prototype.__proto__===Object.prototype); //true
console.log(Person.prototype.constructor===Person); //true
console.log(person1.constructor===Person); //true
console.log(person1.__proto__===Person.prototype); //true
Object.prototype.__proto__==null;
Array.__proto__ === Function.prototype;
Array.__proto__.__proto__ === Object.prototype;
</script>
△警告: 通过现代浏览器的操作属性的便利性,可以改变一个对象的 [[Prototype]] 属性, 这种行为在每一个JavaScript引擎和浏览器中都是一个非常慢且影响性能的操作,使用这种方式来改变和继承属性是对性能影响非常严重的,并且性能消耗的时间也不是简单的花费在 obj.__proto__ = ...
语句上, 它还会影响到所有继承来自该 [[Prototype]] 的对象,如果你关心性能,你就不应该在一个对象中修改它的 [[Prototype]].。相反, 创建一个新的且可以继承 [[Prototype]] 的对象,推荐使用
Object.create()
△警告: 当Object.prototype.__proto__
已被大多数浏览器厂商所支持的今天,其存在和确切行为仅在ECMAScript 2015规范中被标准化为传统功能,以确保Web浏览器的兼容性。为了更好的支持,建议只使用 Object.getPrototypeOf()
。
2. instanceOf()
instanceof
检测左侧的__proto__
原型链上,是否存在右侧的prototype
原型。
3. js继承方式
原型继承:是将上级函数实例赋值给下级函数的原型
4. hasOwnProperty(),isPrototypeOf()
function iterate(obj) {
var arr=[];
for(x in obj)
{
if(obj.hasOwnProperty(x))//查找非原型链上继承来的属性,查找当前对象本身的属性,不能识别原型链上继承来的属性
{
arr.push(x+": "+obj[x]);
}
}
return arr;
}
//输出样例:["foo: bar", "baz: bim"]
isPrototypeOf
是用来判断指定对象object1是否存在于另一个对象object2的原型链中,是则返回true,否则返回false。
格式如object1.isPrototypeOf(object2);
object1是一个对象的实例;
object2是另一个将要检查其原型链的对象。
5.
定义一个函数,它的prototype默认是一个空对象,即{}
var test = function () {return 'haha';};
console.log(test.prototype); // {}