1.繼承有什么作用?
繼承可以將構(gòu)造函數(shù)的prototype屬性跟這個函數(shù)所創(chuàng)建的對象proto共享起來,這樣在創(chuàng)建的對象中不用重寫這些屬性跟方法潜沦,提升了代碼的復(fù)用率亮蒋,使代碼關(guān)系也簡潔明了。
2.有幾種常見創(chuàng)建對象的方式? 舉例說明?
1.普通模式
直接賦值生成一個對象懂傀,不可復(fù)用,代碼量大蜡感。
var obj = {
name = "jirengu",
age = 18,
sayName:function(){
console.log("this.name")
}
}
2.工廠模式
function People(name,age,sex){
var p = {
name:name,
age:age,
sex:sex,
saySex:function(){
console.log('我是'+this.sex)
}
};
return p
}
var p1 = People('hunger',18,'男');
var p2 = People('小紅',16,'女');
3.構(gòu)造函數(shù)模式
function People(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
this.saySex = function(){
console.log('我是'+this.sex)
}
}
p1 = new People('hunger',16,'男');
p2 = new People('gu',15,'女')
這樣每創(chuàng)建一個對象都會有一個saySex的方法 很占用內(nèi)存
4.原型模式
function People(name,age,sex){
}
People.prototype = {
constructor:People,
name:'hunger',
age:17,
sex:'男',
saySxe:function(){
console.log(this.sex)
}
}
var p1 = new People()
原型模式的弊端在于因為屬性和方法共享蹬蚁,使得引用類型屬性容易出現(xiàn)問題。
5.構(gòu)造函數(shù)模式和原型模式組合
function People(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
People.prototype.Saysex = function(){
console.log('我是'+this.sex)
}
var p1 = new People('hunger',13,'男')
這種模式每個實例都擁有自己的屬性郑兴,而方法添加在了原型中犀斋,實現(xiàn)了共用方法,所以這種模式是現(xiàn)在最好的構(gòu)建對象的方法情连。
3.下面兩種寫法有什么區(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);
方法1的屬性跟方法都寫在了構(gòu)造函數(shù)上叽粹,創(chuàng)建對象時每個對象都擁有printName的方法造成了資源浪費。方法2的屬性在構(gòu)造函數(shù)上而方法寫在了原型prototype上,實現(xiàn)了共用方法虫几,節(jié)約了資源锤灿。
4.Object.create 有什么作用?兼容性如何辆脸?如何使用但校?
- Object.create的作用是創(chuàng)建一個指定原型并且可以選擇性的包含指定屬性的對象。
- 兼容性:IE8以上啡氢。
使用方法Object.craete(prototype,[])
function People(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
People.prototype.Saysex = function(){
console.log('我是'+this.sex)
}
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
Person.prototype = Object.create(People.prototype)
var p1 = new Person('hunger',13,'男')//我是男
5.hasOwnProperty有什么作用始腾? 如何使用?
判斷一個屬性是否定義在對象自身空执,而不是在原型鏈上
//接上例
p1.hasOwnProperty('name');//true
p1.hasOwnProperty('Saysex')//false
6.實現(xiàn)Object.create的 polyfill浪箭,如:(ps: 寫個 函數(shù)create辨绊,實現(xiàn) Object.create 的功能)
if(typeof Object.create != 'function'){
Obj.create = (function(){
function Temp(){}
var hasOwn = Object.prototype.hasOwnProperty;
return function(proto){
if(typeof proto != 'object'){
throw TypeError('原型參數(shù)必須是對象或者null')
}else{
Temp.prototype = a;
var obj = new Temp();
a = null;
if(arguments.length > 1){
var Properties = Object(arguments[1]);
for(var prop in Properties){
if(hasOwn.call(Properties,prop)){
obj[prop] = obj[prop]
}
}
}
return obj
}
}
})()
}
7.如下代碼中call的作用是什么?
function Person(name, sex){
this.name = name;
this.sex = sex;
}
function Male(name, sex, age){
Person.call(this, name, sex); //在Male的作用域中調(diào)用Person函數(shù),使Male函數(shù)能夠執(zhí)行Person的代碼门坷,實現(xiàn)構(gòu)造函數(shù)繼承
this.age = age;
}
8. 補全代碼,實現(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();
function Person(name, sex){
this.name = name;
this.sex = sex;
}
Person.prototype.getName = function(){
console.log(this.name)
};
function Male(name, sex, age){
Person.call(this,name,sex);
this.age = age
}
Male.prototype = Object.create(Person.prototype)
Male.prototype.constructor = Male
Male.prototype.getAge = function(){
console.log(this.age)
};
var ruoyu = new Male('若愚', '男', 27);
ruoyu.getAge();