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