js的继承基于原型的继承
1. 构造函数的缺点
2. 这个问题的解决方法,就是JavaScript的原型对象(prototype)
JS的继承是基于原型的继承
- 面向对象编程很重要的一个方面,就是对象的继承。A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法。这对于代码的复用是非常有用的。
- 大部分面向对象的编程语言,都是通过“类”(class)来实现对象的继承。JavaScript 语言的继承则是通过“原型对象”(prototype)。
1. 构造函数(function new)
JavaScript 通过构造函数生成新对象,因此构造函数可以视为对象的模板。实例对象的属性和方法,可以定义在构造函数内部。
构造函数 (es6之前如何实例化一个类,使用构造函数实现一个类)
定义方法:1.就是构造一个对象的函数(Java—构造函数和类名是相同)
2.使用new关键字去实例化对象
<script>
function Person(name,age){
this.name= name;
this.age = age
}
var liu = new Person("liuyushu",18);
console.log(liu.name)
</script>
tip:缺点:通过构造函数为实例对象定义属性,虽然很方便,但是有一个缺点。同一个构造函数的多个实例之间,无法共享属性,从而造成对系统资源的浪费。
2. JavaScript的原型对象(prototype)
添加一个属性
function Person(name,age){
this.name= name;
this.age = age
}
Person.prototype.sayName = function(){
console.log(this.name)
}
var liu = new Person("liuyushu",18);
console.log(liu.name)
liu.sayName()
注意:
1.构造函数:就是构造一个对象的函数(Java--构造函数和类名是相同)
2.使用new关键字去实例化对象
3.在构造函数中 谁使用new关键字调用构造函数,this就指向谁
3.原型对象的理解
function Person(){}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
alert(this.name);
}
var person1 = new Person();
person1.sayName() //"Nicholas"
var person2 = new Person();
person2.sayName() //"Nicholas"
alert(person1.sayName==person2.sayName)//true
- 只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。
- 在默认情况下,所有原型对象都会自动获取一个constructor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针。
- 总结 Person.prototype.constructor指向Person(函数)。而通过这个构造函数,我们还可继续为原型对象添加其他属性和方法。
获取对象原型的方法
Object.getPrototypeOf( )alert(Object.getPrototypeOf(person1) == Person.prototype);//true
alert(Object.getPrototypeOf(person1).name) //"Nicholas"
4.实例和构造函数的关系
创建了自定义的构造函数之后,其原型对象默认只会取得constructor属性;至于其他方法,则都是从object继承而来。
当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象。(这个连接存在于实例与构造函数的原型对象之间,而不是存在于实例和构造函数之间。)
ECMA-262第5版中管这个指针叫[[Prototype]]。虽然在脚本中没有标准的方式访问[[Prototype]], 但Firefox, Safari 和Chrome在每个对象上都支持一个属性proto; 而在其他实现中,这个属性对脚本则是完全不可见的。