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()方法,用来满足这种需求。该方法接受一个对象作为参数,然后以它为原型,返回一个实例对象。该实例完全继承原型对象的属性。

 

 

原型对象

posted @ 2021-05-09 16:18  姓蜀名黍  阅读(191)  评论(0)    收藏  举报