创建对象的方法(二)

  • 原型模式
    一提到原型,大家是不是觉得头大大大大,但是呢,要敢于挑战,静下心来,就会有不一样的收获;
    我们创建的每一个函数都有prototype(原型)属性,这个属性是一个指针,指向了一个对象;
    使用原型对象的好处就是可以让所有的对象实例共享它的属性和方法;
    不必在构造函数中定义对象实例的信息,将这些信息直接添加到原型对象中;
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})

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容