1.继承有什么作用?
继承可以将构造函数的prototype属性跟这个函数所创建的对象proto共享起来,这样在创建的对象中不用重写这些属性跟方法,提升了代码的复用率,使代码关系也简洁明了。
2.有几种常见创建对象的方式? 举例说明?
1.普通模式
直接赋值生成一个对象,不可复用,代码量大。
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.构造函数模式
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,'女')
这样每创建一个对象都会有一个saySex的方法 很占用内存
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()
原型模式的弊端在于因为属性和方法共享,使得引用类型属性容易出现问题。
5.构造函数模式和原型模式组合
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,'男')
这种模式每个实例都拥有自己的属性,而方法添加在了原型中,实现了共用方法,所以这种模式是现在最好的构建对象的方法。
3.下面两种写法有什么区别?
//方法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的属性跟方法都写在了构造函数上,创建对象时每个对象都拥有printName的方法造成了资源浪费。方法2的属性在构造函数上而方法写在了原型prototype上,实现了共用方法,节约了资源。
4.Object.create 有什么作用?兼容性如何?如何使用?
- Object.create的作用是创建一个指定原型并且可以选择性的包含指定属性的对象。
- 兼容性: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.实现Object.create的 polyfill,如:(ps: 写个 函数create,实现 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('原型参数必须是对象或者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的作用域中调用Person函数,使Male函数能够执行Person的代码,实现构造函数继承
this.age = age;
}
8. 补全代码,实现继承
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();