创建对象的方法(二)

2018-05-29  本文已影响0人  QinRenMin
function Person() {

}

Person.prototype.name = "qrm";
Person.prototype.age = 20;
// noinspection JSAnnotator
Person.prototype.say = function () {
    console.log(this.name);
};

let person1 = new Person();
person1.say(); //qrm

let person2 = new Person();
person2.name = "qwe";
person2.say(); //qwe
console.log(person1.say===person2.say);//true

理解原型:



属性对象和实例之间的判断

console.log("name" in person1); //true 原型中
console.log("name" in person2); //true 实例中
console.log(person1.hasOwnProperty("name")); //false 实例没有name属性
console.log(person2.hasOwnProperty("name"));//true 实例有name属性

//如何判断属性在实例中还是原型中?
let person3 = new Person();

if(person3.hasOwnProperty("name") &&("name" in person3) === true)
{
    console.log("name属性在实例中");
}
else{
    console.log("name属性在原型中");
}

person3.name = "assdf";

if(person3.hasOwnProperty("name") &&("name" in person3) === true)
{
    console.log("name属性在实例中");
}
else{
    console.log("name属性在原型中");
}

取得对象上所有可以枚举的实例属性,Object.keys()方法,接收一个对象作为参数,返回所有可以枚举属性的字符串数

let key = Object.keys(Person.prototype);
console.log(key);


let person4 = new Person();
person4.name = "qqqqq";
let p4key = Object.keys(person4);
console.log(p4key);

//得到所有的实例属性

let keys = Object.getOwnPropertyNames(Person.prototype);
console.log(keys);

//输出值为:
//     [ 'name', 'age', 'say' ]
//     [ 'name' ]
//     [ 'constructor', 'name', 'age', 'say' ]
//

function P() {

}

P.prototype={
    name:"zzz",
    age : 23,
    tell:function () {
        console.log(this.age);
    }
};

let P1 = new P();

console.log(P1 instanceof Object); //true
console.log(P1 instanceof P); //true

console.log(P1.constructor === P); //false
console.log(P1.constructor === Object); //true

上述方法无法确定对象的类型 ,可以将constructor属性设置为适当的值
但是重新设置的constructor会将[[Enumerable]]设置为true
解决该类问题,引入Object.defineProperty(P.property,"constructor",{enumerable:false})

对于原型这一块的理解,应当更加深入,为后来的继承问题做好铺垫.
学习这块内容要淡定,从容,平静,多看多理解咯....

上一篇下一篇

猜你喜欢

热点阅读