创建对象的方法(二)
2018-05-29 本文已影响0人
QinRenMin
- 原型模式
一提到原型,大家是不是觉得头大大大大,但是呢,要敢于挑战,静下心来,就会有不一样的收获;
我们创建的每一个函数都有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})
对于原型这一块的理解,应当更加深入,为后来的继承问题做好铺垫.
学习这块内容要淡定,从容,平静,多看多理解咯....