马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
一. 原型和原型链
原型(prototype):保存所有子对象共有成员的对象
每个构造函数都有一个原型属性引用了该构造函数对应的原型对象
由构造函数创建的每个对象中都有一个__proto__属性,指向构造函数的原型对象,在访问子对象的成员时,优先在成员本地找。找不到,再去构造函数的原型中查找。
new:1. 创建空对象
2. 调用构造函数,为新对象添加成员
3. 设置当前对象的__proto__属性为构造函数的原型对象
4.将新对象的地址保存到obj变量中
例如:
- //原型
- function Student(sname,age){
- this.sname=sname;
- this.age=age;
- }
- //为构造函数的原型对象 添加intrSelf函数
- Student.prototype.intrSelf=function(){
- console.log("I'm "+this.sname+","+" I'm "+this.age);
- };
-
- var lilei=new Student("lilei",18);
- var hmm=new Student("hmm",19);
- console.log(lilei.sname);
- console.log(lilei.age);
- lilei.intrSelf();
- console.log(hmm.sname);
- console.log(hmm.age);
- hmm.intrSelf();
复制代码
原型链:由各级对象的__proto__逐级向上引用形成的多级继承关系
所有的对象都有一个__proto__属性,指向自己的父对象
属性何时放在构造函数中:每个对象自有的
属性何时放在原型对象中:所有子对象共有的
上面程序的原型链如下:
二.原型相关API:
1. 判断对象的属性是自有,还是共有:
自有属性:保存在对象本地的属性
共有属性:保存在公共原型对象中的属性
如何判断一个属性是否可用:
1. in关键字:"属性名" in 对象
如果"属性名"在当前对象的原型链中,返回true
如果在整条原型链上都没找到,返回false
例如:
- //判上面代码中 lilei和hmm是否可用intrSelf函数
- console.log("intrSelf" in lilei); console.log("intrSelf" in hmm);
复制代码
2. 使用===undefined:说明不包含!
简写为(!对象.成员名)
例如:
- console.log(lilei.intrSelf===undefined); console.log(!hmm.intrSelf);
复制代码
专门判断是否自有属性:obj.hasOwnProperty("成员");
如果obj本地有指定"成员",则返回true,没有返回false
例如:
- hmm.money=5;
- console.log(hmm.hasOwnProperty("money")); //true console.log(lilei.hasOwnProperty("money"));//false
复制代码
判断共有属性:不是自有的,还要存在于原型链上
if(!obj.hasOwnProperty("属性")&&"属性" in obj)
例如:
- //判断共有属性
- console.log(!(hmm.hasOwnProperty("intrSelf"))&&
- ("intrSelf" in hmm));//true
- console.log(!(hmm.hasOwnProperty("sname"))&& ("sname" in lilei));//false
复制代码
2. 获得任意对象的__proto__属性:获得父对象
var 父对象=Object.getPrototypeOf(对象);
例如:
- //获得lilei的对象
- var father=Object.getPrototypeOf(lilei); console.log(father);
复制代码
- //判断hmm的父对象是否等于lilei的父对象
- console.log(Object.getPrototypeOf(lilei)== (Object.getPrototypeOf(hmm)));
复制代码
3. 判断父对象是否处在子对象原型链的上级:
父对象.isPrototypeOf(子对象)
只要父对象在子对象的原型链上,就返回true
否则返回false
例如:
- //判断Student的原型对象是否处于hmm对象的上级 console.log(Student.prototype.isPrototypeOf(hmm));
复制代码
4.删除对象中的属性:delete 对象.成员
只能删除自有的成员
只有var声明的全局变量不让delete
使用window.或window[""]增加的全局成员可以delete
例如:
- //删除hmm.money属性
- hmm.money=5;
- console.log(hmm.hasOwnProperty("money"));
- delete hmm.money; console.log(hmm.hasOwnProperty("money"));
复制代码
//var 声明的变量不让删
|