繼承有什么作用?
繼承可以讓子類擁有父類的方法和屬性,然后在這個(gè)基礎(chǔ)上進(jìn)行方法和屬性調(diào)用烈和,可以提高代碼的復(fù)用性和效率。
下面兩種寫(xiě)法有什么區(qū)別?
//方法1
function People(name, sex){
this.name = name;
this.sex = sex;
this.printName = function(){
console.log(this.name);
}
}
var p1 = new People('饑人谷', 2)
//方法2
function Person(name, sex){
this.name = name;
this.sex = sex;
}
Person.prototype.printName = function(){
console.log(this.name);
}
var p1 = new Person('若愚', 27);
- 寫(xiě)法1 把
printName
方法放在了構(gòu)造函數(shù)里卤档,每次new
一個(gè)對(duì)象的時(shí)候怔锌,都會(huì)實(shí)例化當(dāng)前對(duì)象的printName
方法。如果當(dāng)前new10個(gè)People
對(duì)象宋距,都會(huì)重復(fù)實(shí)例化當(dāng)前printName
方法10次轴踱,這樣重復(fù)非常浪費(fèi)空間。 - 寫(xiě)法2 在每次
new
一個(gè)對(duì)象的時(shí)候谚赎,都不會(huì)重復(fù)實(shí)例化printName
方法淫僻,因?yàn)?code>printName方法在原型鏈上,如果當(dāng)前new10個(gè)People
對(duì)象壶唤,原型鏈上printName
不會(huì)重復(fù)實(shí)例化雳灵,所有的對(duì)象都會(huì)共用原型鏈上的方法,這樣就會(huì)節(jié)約空間闸盔。
Object.create 有什么作用悯辙?兼容性如何?
Object.create()
方法使用指定的原型對(duì)象和其屬性創(chuàng)建了一個(gè)新的對(duì)象迎吵。
語(yǔ)法 Object.create(proto, [ propertiesObject ])
參數(shù)
proto
一個(gè)對(duì)象躲撰,應(yīng)該是新創(chuàng)建的對(duì)象的原型。
propertiesObject
可選击费。該參數(shù)對(duì)象是一組屬性與值拢蛋,該對(duì)象的屬性名稱將是新創(chuàng)建的對(duì)象的屬性名稱,值是屬性描述符(這些屬性描述符的結(jié)構(gòu)與Object.defineProperties()
的第二個(gè)參數(shù)一樣)蔫巩。注意:該參數(shù)對(duì)象不能是 undefined
谆棱,另外只有該對(duì)象中自身?yè)碛械目擅杜e的屬性才有效快压,也就是說(shuō)該對(duì)象的原型鏈上屬性是無(wú)效的。
兼容性:
create.png
hasOwnProperty有什么作用础锐? 如何使用嗓节?
hasOwnProperty()
方法會(huì)返回一個(gè)布爾值,指示對(duì)象是否具有指定的屬性作為自身(不繼承)屬性皆警。
var o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop'); // 返回 true
o.hasOwnProperty('toString'); // 返回 false
如下代碼中call的作用是什么?
function Person(name, sex){
this.name = name;
this.sex = sex;
}
function Male(name, sex, age){
Person.call(this, name, sex); //這里的 call 有什么作用
this.age = age;
}
call
調(diào)用Person
函數(shù) 第一個(gè)參數(shù)this
指向Male
拦宣,使Male
函數(shù)實(shí)現(xiàn)構(gòu)造函數(shù)繼承,獲取Person
下的屬性
補(bǔ)全代碼信姓,實(shí)現(xiàn)繼承
function Person(name, sex){
// todo ...
}
Person.prototype.getName = function(){
// todo ...
};
function Male(name, sex, age){
//todo ...
}
//todo ...
Male.prototype.getAge = function(){
//todo ...
};
var ruoyu = new Male('若愚', '男', 27);
ruoyu.printName();
代碼實(shí)例
function Person(name, sex){
this.name = name;
this.sex = sex;
}
Person.prototype.getName = function(){
console.log('Person name is '+ this.name);
};
function Male(name, sex, age){
Person.call(this, name, sex);
this.age = age;
}
// 方法1
Male.prototype = new Person();
// 方法2
// Male.prototype = Object.create(Person.prototype)
Male.prototype.printName = function(){
console.log(this.name);
}
Male.prototype.getAge = function(){
console.log(this.name +'--'+ this.age);
};
var ruoyu = new Male('若愚', '男', 27);
var jirengu = new Person('jirengu', '男', 3);
ruoyu.printName();
ruoyu.getAge();
jirengu.getName();