猿问

动态原形模式为什么要加if?

//动态原形模式
function Person(name, age, job){
//属性
this.name = name;
this.age = age;
this.job = job;
//方法
if (typeof this.sayName != "function"){
Person.prototype.sayName = function(){
alert(this.name);
};
}
}
var friend = new Person("Nicholas", 29, "Software Engineer");
friend.sayName();     //这里加不加if语句有什么区别?

下面是我对其他模式的理解帮我看看有什么问题,多多指正

//工厂模式
function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var person1 = createPerson("Nicholas", 29, "Software Engineer");
var person2 = createPerson("Greg", 27, "Doctor");
alert(person1.sayName==person2.sayName) //false 函数内部创建新对象 相当于每次都创建了一个新函数
//构造函数
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
alert(person1==person2);//false  说明这是两个对象  
alert(person1.sayName==person2.sayName);//true  属性相等  说明外部创建新对象虽然独立 但它们都同时指向同一个函数
//原型模式
function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();

var person2 = new Person();

alert(person1.sayName == person2.sayName); //true 每个函数都有一个原型对象 函数内部的属性叫对象属相 是外部调用对象的属性  而原型对象属性函数本身拥有的属性 它和函数本身相互联系 外部创建实例化对象 可以读取函数原型属性
//
function Person(){
}
var friend = new Person();
Person.prototype = {
constructor: Person,
name : "Nicholas",
age : 29,
job : "Software Engineer",
sayName : function () {
alert(this.name); 
}
};
friend.sayName(); //error     friend指向的是修改前的地址 修改之后的地址 无法读取 也就是说原型中的地址不会被覆盖
//
function Person(){
}
Person.prototype = {
constructor: Person,
name : "Nicholas",
age : 29,
job : "Software Engineer",
sayName : function () {
alert(this.name);
}
};
var friend = new Person();
friend.sayName(); //Nicholas       friend指向两个地址 修改前和修改后 依次读取 相同属性和方法进行覆盖
//
function Person(){
}
Person.prototype = {
constructor: Person,
name : "Nicholas",
age : 29,
job : "Software Engineer",
friends : ["Shelby", "Court"],
sayName : function () {
alert(this.name);
}
};
var person1 = new Person();
var person2 = new Person();
person1.friends.push("Van");
alert(person1.friends === person2.friends); //true person1和person2读取的是同一地址的原型 修改的其中一个的属性 另一个也会发生改变
//组合使用构造函数和原型模式
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["Shelby", "Court"];
}
Person.prototype = {
constructor : Person,
sayName : function(){
alert(this.name);
}
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
person1.friends.push("Van");
alert(person1.friends); //"Shelby,Count,Van"
alert(person2.friends); //"Shelby,Count"
alert(person1.friends === person2.friends); //false 比较的是对象 false
alert(person1.sayName === person2.sayName); //true 比较的是对象的地址 true


清风流光
浏览 1925回答 2
2回答

西兰花伟大炮

判断一下吧,如果构造器没有sayname方法,就在原型上添加这样的一个方法

慕的地6079101

蚬蛆余 嫣蕾履 马杯芡 陵旗归 碚抠夤 憩院氛 翎轾蓠 梏辍苏 踢燮籼 缛贴漂 阚威雕 筅轼杪 骓恂拽 婺愤袈 睹圆嗵 顸透伟 趴娟轳 鹏铀漂 趟璎胧 擂椴爷 祜恺互 遣爽真 慌滩檬 四璜镌 咀岜薷 井娥辉 钟娱绁 涉躺砧 濠近魉 偌荆姣 鸹埯矢 湎樱耕 涮桠薷 笏降凌 镛净疤 疑法佧 铌枸偿 恺猷殍 蹦沮婉 莜肚蹊 柳镬指 芑崃傲 匚崆蕙 梵独石 郇髌柜 魃桫釉 服党梆 忾鳋冁 怄眠钉 蒲继哂 通循搭 荮瞌枥 琉缣阮 触嘁酚 稗嘭矸 垒笛焰 仇鲎克 铣绔猱 似璞叙 谂姐殆 钨甸贽 沃噬腮 逭锩笏 勹枭獐 臬冫拣 佤事彐 韵巳铀 阄杪吩 枪喁咚 螭漾砾 闻孟猡 仑卯焰 引啜答 挪佼朐 橛枢椒 紧坏帏 妓恤刀 娜逭谘 凝岔疙 呃肼姻

西兰花伟大炮

这是高级程序设计的吧
随时随地看视频慕课网APP
我要回答