JS中的继承和Object
大部分编程语言的继承是通过类‘’class''来实现,而javascript需要通过原型链实现继承的。
事实上 ES6引入的class语法,也是通过原型实现类的继承
原型对象
js创建实例对象,生成相同的属性方法,对应不会变化的属性方法,会造成内存浪费。
所以JavaScript的原型对象就出来了 prototype.
如果属性和方法定义到了原型对象上面,所有的实例对象就可以共享了。
如果实例对象有某个方法或者属性,在调用的时候就不会去原型对象上面寻找了。
原型对象的作用,就是定义所有实例对象共享的属性和方法。这也是它被称为原型对象的原因,而实例对象可以视作从原型对象衍生出来的子对象
原型链
1. 所有对象都有自己的原型对象,任何对象都可以充当其他对象的原型。
2. 原型对象也是对象,也会有自己的原型。所以形成一条链。
constructor属性
原型对象 prototype对象有一个 constructor属性,
默认指向prototype对象所在的构造函数。
任何实例对象的constructor属性都是读取原型链上面的
constructor属性而来的。
constructor属性的作用是可以得知某个实例是哪一个构造函数产生的。
所以创建实例也可以通过 new 实例的constructor属性来得到
constructor属性表示原型对象与构造函数之间的关联关系,如果修改了原型对象,
一般会同时修改constructor属性, 否则会导致 constructor可能会指向Object,会导致
instanceof运算符失真。
如果不能知道constructor属性是什么函数,可以通过那么属性获取。
构造函数的继承
1. 子类的构造函数调用父类的构造函数
2.子类的原型对象指向父类的原型(new的原型)
3.子类的构造方法指向他自己
function Shape() {
this.x = 0;
this.y = 0;
}
Shape.prototype.move = function (x, y) {
this.x += x;
this.y += y;
console.info('Shape moved.');
};
// 我们需要让Rectangle构造函数继承Shape。
// 第一步,子类继承父类的实例
function Rectangle() {
Shape.call(this); // 调用父类构造函数
}
// 另一种写法
function Rectangle() {
this.base = Shape;
this.base();
}
// 第二步,子类继承父类的原型
Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;
js实现多重继承
function M1() {
this.hello = 'hello';
}
function M2() {
this.world = 'world';
}
function S() {
M1.call(this);
M2.call(this);
}
// 继承 M1
S.prototype = Object.create(M1.prototype);
// 继承链上加入 M2
Object.assign(S.prototype, M2.prototype);
// 指定构造函数
S.prototype.constructor = S;
var s = new S();
s.hello // 'hello'
s.world // 'world'
模块的基本写法
var module1 = (function () { var _count = 0; var m1 = function () { //... }; var m2 = function () { //... }; return { m1 : m1, m2 : m2 }; })();
Object
assign(A, B). 将B对象的属性融合覆盖至A对象,是一种深Copy, 返回一个新对象。
getPrototypeOf() :Object.getPrototypeOf方法返回参数对象的原型.
setPrototypeOf():
Object.setPrototypeOf方法为参数对象设置原型,返回该参数对象
new命令可以使用Object.setPrototypeOf方法模拟
var F = function() {this.foo = 'a'};
var f = new F();
//等同
var f = Object,setPrototypeOf({}, F.prototype);
F.call(f);
Object.create()
从一个实例对象,生成另一个实例对象呢?
JavaScript 提供了Object.create()方法,用来满足这种需求。该方法接受一个对象作为参数,然后以它为原型,返回一个实例对象。该实例完全继承原型对象的属性。
原型对象

浙公网安备 33010602011771号