js构造函数,原型对象,继承 (2)
2017-09-26 20:43
267 查看
从上一篇日志中我们注意到,每添加一个属性和方法就要敲一遍Person.prototype.为了减少不必要的输入。更常见的一种做法是用
一个包含所有属性和方法的对象字面量来重写整个原型对象。如下:
function Person(){
}
Person.prototype={
name:"windy",
age:"19",
act:function(){console.log(this.name)}
};
var friend=new Person()
console.log(friend instanceof Object); //true
console.log(friend instanceof Person); //true
console.log(friend.constructor==Person);//false
console.log(friend.constructor==Object);//true
如上代码,将Person.prototype设置为等于一个以对象字面量形式创建的对象。最终结果也相同。但是有一个例外:constructor属性不再指向Person。
每创建一个函数,就会同时创建它的prototype对象。这个对象也会自动获得constructor属性。而我们在这里使用的语法,本质上完全重写了默认的prototype对象,
因此constructor属性也就变成了新对象的constructor属性(指向Object),而不再指向Person.
修改如下:
function Person(){
}
Person.prototype={
constructor:Person,
name:"windy",
age:"19",
act:function(){console.log(this.name)}
};
var friend=new Person()
console.log(friend instanceof Object); //true
console.log(friend instanceof Person); //true
console.log(friend.constructor==Person);//true
console.log(friend.constructor==Object);//false
以上代码特意包含了一个constructor属性,并将它的值设置为Person,从而确保了通过该属性能够访问到适当的值。
原型对象的问题:
例子:
function Person(){
}
Person.prototype={
constructor:Person,
name:"windy",
age:"19",
friend:["justin","ben"],
act:function(){console.log(this.name)}
};
var person1=new Person();
var person2=new Person();
person1.friend.push("VAN");
console.log(person1.friend);//["justin","ben","WAN"]
console.log(person2.friend);//["justin","ben","WAN"]
我们给person1的friend属性新增“VAN”,但是打印之后可以看到,根本没有新增到数组中去。解决办法:组合使用构造函数与原型
构造函数用于定义实例属性,而原型用于定义共享的属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方的方法的引用,最大
限度的节省内存。
优化后代码:
function Person(name,age,friend){
this.name=name;
this.age=age;
this.friend=["justin","ben"];
}
Person.prototype={
constructor:Person,
act:function(){console.log(this.name)}
};
var person1=new Person();
var person2=new Person();
person1.friend.push("VAN");
console.log(person1.friend);//["justin","ben","WAN"]
console.log(person2.friend);//["justin","ben"]
一个包含所有属性和方法的对象字面量来重写整个原型对象。如下:
function Person(){
}
Person.prototype={
name:"windy",
age:"19",
act:function(){console.log(this.name)}
};
var friend=new Person()
console.log(friend instanceof Object); //true
console.log(friend instanceof Person); //true
console.log(friend.constructor==Person);//false
console.log(friend.constructor==Object);//true
如上代码,将Person.prototype设置为等于一个以对象字面量形式创建的对象。最终结果也相同。但是有一个例外:constructor属性不再指向Person。
每创建一个函数,就会同时创建它的prototype对象。这个对象也会自动获得constructor属性。而我们在这里使用的语法,本质上完全重写了默认的prototype对象,
因此constructor属性也就变成了新对象的constructor属性(指向Object),而不再指向Person.
修改如下:
function Person(){
}
Person.prototype={
constructor:Person,
name:"windy",
age:"19",
act:function(){console.log(this.name)}
};
var friend=new Person()
console.log(friend instanceof Object); //true
console.log(friend instanceof Person); //true
console.log(friend.constructor==Person);//true
console.log(friend.constructor==Object);//false
以上代码特意包含了一个constructor属性,并将它的值设置为Person,从而确保了通过该属性能够访问到适当的值。
原型对象的问题:
例子:
function Person(){
}
Person.prototype={
constructor:Person,
name:"windy",
age:"19",
friend:["justin","ben"],
act:function(){console.log(this.name)}
};
var person1=new Person();
var person2=new Person();
person1.friend.push("VAN");
console.log(person1.friend);//["justin","ben","WAN"]
console.log(person2.friend);//["justin","ben","WAN"]
我们给person1的friend属性新增“VAN”,但是打印之后可以看到,根本没有新增到数组中去。解决办法:组合使用构造函数与原型
构造函数用于定义实例属性,而原型用于定义共享的属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方的方法的引用,最大
限度的节省内存。
优化后代码:
function Person(name,age,friend){
this.name=name;
this.age=age;
this.friend=["justin","ben"];
}
Person.prototype={
constructor:Person,
act:function(){console.log(this.name)}
};
var person1=new Person();
var person2=new Person();
person1.friend.push("VAN");
console.log(person1.friend);//["justin","ben","WAN"]
console.log(person2.friend);//["justin","ben"]
相关文章推荐
- js构造函数,原型对象,继承 (3)
- 继承:《原型和原型链(prototype 属性使您有能力向对象添加属性和方法。)》
- javscript通过原型链方式显示对象继承
- 面向对象与原型---继承
- Javascript对象继承(原型继承法)
- Js中的对象、构造函数、原型、原型链及继承
- 面向对象--原型继承
- 算法-javascript自实现继承extend(单次继承原型对象和单次继承构造函数)
- 一步步学习javascript基础篇(5):面向对象设计之对象继承(原型链继承)
- JavaScript-通过原型继承一个对象
- 6-1通过原型继承创建一个新对象
- 设计模式知识连载(5)---继承_1:子类的原型对象-类式继承
- 对象的原型与继承(一)
- 深入理解JavaScrip面向对象和原型继承
- 对象、原型、继承
- JavaScript对象原型继承关系图
- 继承的简单理解,原型对象继承,类继承,混合方式继承
- HTML5_对象-雪花-PK-封装-继承-原型
- 简析面向对象中的继承,原型链,闭包之继承 7fe0
- dojo 中对象扩展与原型继承的实现