20_面向对象程序设计(原型【三】常用方法详解)

isPrototypeOf(实例对象) 判断原型的方法

//判断类(函数)的原型对象是不是类实例的原型
console.info(Person.prototype.isPrototypeOf(p1)); //true

ECMA5新特性 Object.getPrototypeOf():根据实例对象获得原型对象

//ECMA5: Object.getPrototypeOf(obj) 根据实例对象获取原型对象的方法
function Person(){
}

Person.prototype.name = "z3";
Person.prototype.age = 20;
Person.prototype.sayName = function(){
    console.info("我是原型对象的方法!");
};

var p1 = new Person();
console.info(p1.name); //z3
var protoObj = Object.getPrototypeOf(p1);
console.info(protoObj === Person.prototype); //true

    每次读取一个对象的属性的时候,首先会进行一次搜索:
        1、如果实例对象中有需要的属性,取实例对象中的属性值;
        2、如果实例对象中没有,需要去原型对象中搜索,如果找到返回原型对象中的值;
        3、如果原型对象中也没有,返回undefined

delete操作符 删除实例对象中的属性

var p2 = new Person();
console.info(p2.name); //z3
p2.name = "w5";
console.info(p2.name); //w5
delete p2.name; //使用delete删除实例对象中的属性
console.info(p2.name); //z3

object.hasOwnProperty(attribute) 判断属性是否属于对象本身

//判断一个对象属性是否是实例属性
var p3 = new Person();
p3.name = "z6";
console.info(p3.name); 
console.info(p3.hasOwnProperty("name")); //true
console.info(p3.hasOwnProperty("age")); //false
console.info(p3.hasOwnProperty("name1")); //false

in 操作符 判断对象中是否存在该属性(无论是实例对象还是原型对象)

//in for-in操作符
//in操作符 判断属性是否存在于实例对象和原型对象中,存在属性即可
var p1 = new Person();
console.info("name" in p1); //true
var p2 = new Person();
p2.name = "w3"; 
console.info("name" in p1); //true

//获取全部的属性,不区分实例对象和原型对象
for(var attr in p2){
    console.info(attr);
}

    判断一个属性是否存在原型对象中:

//判断条件:
//  1、不在实例对象中 !hasOwnProperty(propName)
//  2、这个对象可以使用属性 propName in obj
function hasPrototypeProperty(obj, propName){
    return !obj.hasOwnProperty(propName) && propName in obj;
}

var p3 = new Person();
p3.name = "xiao A";
console.info(hasPrototypeProperty(p3, "name"));

ECMA5新特性 Object.keys();拿到当前对象里的所有keys 返回一个数组  
ECMA5新特性 Object.getOwnPropertyNames 枚举对象所有的属性:不管该内部属性能否被枚举

//ECMA5新特性 Object.keys(obj) Object.getOwnPropertyNames(obj)
//两个方法都是用来枚举实例对象的属性名称
//Object.keys(obj) 枚举出实例对象中可枚举的属性名称
//Object.getOwnPropertyNames(obj) 枚举出实例对象中所有的属性名称,例如constructor属性是不可枚举的
var p1 = new Person();
var arr1 = Object.keys(p1); // []
var arr2 = Object.getOwnPropertyNames(p1); // []
var arr3 = Object.keys(Object.getPrototypeOf(p1)); // ["name", "age", "sayName"] 
var arr4 = Object.getOwnPropertyNames(Object.getPrototypeOf(p1)); //["constructor", "name", "age", "sayName"]
console.info(arr1);
console.info(arr2);
console.info(arr3);
console.info(arr4);

你可能感兴趣的:(原型的常用方法)