继承相关问题
1、继承有什么作用?
在一个基于类的语言(如Java)中,继承(inheritance)提供两个有用的服务。首先,它是代码重用的一种形式,若一个新的类与另一个已存在的类大部分相似,那么我们通过继承可以减少很多不必要的代码;其次类继承的好处是引入了一套类型系统的规范,无需编写显试类型转换的代码。
而JavaScript是作为一门弱类型的语言,是不需要类型转换的,也没有原生的继承机制。JavaScript是作为基于原型的语言,这意味着对象需要从其他的对象中继承,在JavaScript中继承是:指一个对象直接使用另一对象的属性和方法
2、下面两种写法有什么区别?
//方法1
function People(name, sex){
this.name = name;
this.sex = sex;
this.printName = function(){ //将printName方法定义在People构造对象上,当构造的对象比较多的时候,会影响性能,且有点混乱
console.log(this.name);
}
}
var p1 = new People('饥人谷', 2)
//方法2
function Person(name, sex){
this.name = name;
this.sex = sex;
}
Person.prototype.printName = function(){ /将printName方法定义在People的原型链上,当new一个People可以通过原型链来获取这个方法,一般推荐使用这种
console.log(this.name);
}
var p1 = new Person('若愚', 27);
3、Object.create 有什么作用?兼容性如何?
Object.create()方法使用指定的原型对象和其他属性创建一个新的对象
demo:使用Object.create实现类试继承
//创建一个构造函数Shape
function Shape() {
this.x =0;
this.y =0;
}
Shape.prototype.move = function(x, y) {
this.x += x;
this.y += y;
};
//创建一个构造函数Rectangle
function Rectangle() {
Shape.call(this); //call super constructor.
}
//通过Object.create将Rectangle的原型链指向Shape.prototype
Rectangle.prototype = Object.create(Shape.prototype);
var rect = new Rectangle() //创建一个新的对象
rect instanceof Rectangle //true.
rect instanceof Shape //true.
- 兼容性:
4: hasOwnProperty有什么作用? 如何使用?
hasOwnProperty() 方法会返回一个布尔值,指示对象是否具有指定的属性作为自身(不继承)属性。
demo:
o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop'); // 返回 true
o.hasOwnProperty('toString'); // 返回 false,toString是原型链上的属性(Object对象的)
o.hasOwnProperty('hasOwnProperty') //返回false,hasOwnProperty是原型链上的属性(Object.prototype.hasOwnProperty)
总结:hasOwnProperty其实就是判断一个对象的属性是本身具有的(true),还是需要在原型链上找到的(false)
5、如下代码中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有什么用,还是先从这里的this说起吧,之前在我简书的博客深入之作用域链中写过this不是词法作用域,要知道this指向哪里,需要在对象被创建或函数被调用的时候才知道。
这里我们创建一个对象
var o = new Male('qi','man' 22)
,那么我们知道在函数的构造器调用模式中,新对象o首先会创建一个连接到Male.prototype,同时this将被绑定到这个新对象上,那么这个时候构造函数中的this就是指向o对象了,即Person.call(o, name, sex)
,那么call的作用就很明确了,就是向Person中的this指向o,同时我们可以得出一个结论就是:当new一个新对象的时候,Male和Person中的this都是指向该新对象
6、实现继承
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.getAge = function(){
console.log(this.age)
};
var ruoyu = new Male('若愚', '男', 27);
ruoyu.getName();
运行结果