JavaScript 继承的一些点

在 JavaScript 中,我们创建一个对象通常使用字面量的形式来创建,例如:

const obj = {
  name: 'kaijun',
  age: 23,
  gender: 'male'
}

当然,我们也可以用创建 Object 对象实例的方法来写:

const obj = new Object();
obj.name = 'kaijun';
obj.age = 23;
obj.gender = 'male';

但是即使是比较简洁的字面量形式,在创建多个对象时,也会有很多冗余的代码,比如:

const A = {
  name: 'xiaoming',
  age: 20,
  gender: 'male'
}

const B = {
  name: 'xiaohong',
  age: 21,
  gender: 'female'
}

可以看到,上面的 name、age、gender 都太多余了,于是聪明的我们就可能会封装一下:

function Person(name, age, gender) {
  return {
    name,
    age,
    gender
  }
}
const A = Person('xiaoming', 20, 'male');
const B = Person('xiaohong', 21, 'female');

如果你会这样写,恭喜你已经掌握了工厂模式,这样的话代码就会优雅许多了。但是这样做有一个缺点,就是你无法知道对象的类型。

typeof A === 'Person' // false
A instanceof Person // false

这太不方便了吧,于是聪明的你可能又会想到构造函数模式:

function Person(name, age, gender) {
  this.name = name;
  this.age = age;
  this.gender = gender;
}
const A = new Person('xiaoming', 20, 'male');
const B = new Person('xiaohong', 21, 'female');

构造函数和工厂模式很像,主要有以下两点区别:

  • 方法没有 return,而是直接把参数赋值给 this 下的同名变量,这样做是因为后面 new 的时候,会把 this 指向调用 new 出来的那个实例对象,所以就完成了赋值操作;
  • 调用的构造函数的时候,在构造函数前面加一个 new(如果没有加 new,就当做普通函数使用,作用于会在当前代码块的环境里面,函数里面的值会赋值给当前作用域);

通过构造函数 new 出来的对象,我们是能检测到它的类型的:

A instanceof Student // true
A instanceof Object // true

未完待续……

转载于:https://my.oschina.net/u/3117745/blog/2980407

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值