【JavaScript】动态原型模式创建对象 ||为何不能用字面量创建原型对象?

   var proto = "";
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
if (typeof this.sayname != 'function') {
//这里不能使用字面量创建原型对象
//Person.prototype.sayname = function() {
// console.log("name = " + this.name);
// };
proto = Person.prototype;//没有经过字面量重写的原型对象
//假如使用字面量创建原型对象
Person.prototype =
{
sayname: function() {
console.log("Name:" + this.name);
}
}
console.log(proto == Person.prototype)//false 说明Person原型对象已被重写改变
}
}
var person = new Person("Jack", , 'Programmer');
console.log(person.__proto__ == proto);//true 实例对象的__proto__指向原先的原型对象,而不是被字面量重写的原型对象
person.sayname();//undefined 没有新原型对象的方法
在已经创建了实例的情况再用字面量重写原型,那么就会切断现有实例与新原型之间的联系,以上说的换个写法就如下:
        function Person() { };
var proto = Person.prototype;
var person = new Person;//实例对象在前
Person.prototype =
{
name: "Jack",
sayname: function() {
console.log("Name:" + this.name);
}
}
console.log(Person.prototype.isPrototypeOf(person)); //false 新原型不在person对象原型链上
console.log(proto.isPrototypeOf(person)); //true 原先的原型对象在person对象原型链上

如果要实现为已经创建的实例对象添加方法,可以这样写:

        function Person() { }
var person = new Person();//实例对象在前
Person.prototype.name = 'Jack';
Person.prototype.sayName = function() {
console.log(this.name);
}
person.sayName();//Jack

这样做就不是重新声明一个原型对象,而是对原来的原型对象进行扩展。

上一篇:BZOJ 1036 树的统计-树链剖分


下一篇:iOS组件化方案的几种实现