编写可维护的代码规则第4篇。
本篇主要讲下对象的属性与方法的修改问题。由于js中修改对象的属性和方法简直容易至极,所以任何人都可以更改js中的具有可访问可修改权限的对象。这就带来极大的风险,容易造成各种奇葩的bug问题且难以排查,更别说如果是多人协同开发的情况下,某个人改动已有方法时,一旦产生bug,且被其他维护,那找起问题根源的麻烦程度简直是想要杀人的。
所以为了人生财产安全,在js维护时,个人是不建议对已有对象方法属性进行修改、删除的,除非你是对象的所有者,了如指掌。
通常对于对象想要修改或新增或删除方法属性时,建议是继承个新对象出来,新对象拥有被继承对象的所有属性和方法,且不会影响到原对象在源码中的使用。
js中的继承有两种:基于对象的继承和基于类型的继承。
基于对象的继承,可以使用Object.create()
方法。
var obj = {
name: 'nitx',
sayName: function(){
console.log(this.name);
}
}
var obj2 = Object.create(obj);
obj2.sayName(); //nitx
//当obj2重新定义sayName()方法时,不会影响到被继承对象中的方法
obj2.sayName = function(){
console.log('her name is sxm.');
}
obj2.sayName(); //her name is sxm.
obj.sayName(); // nitx
Object.create()
方法还可以传入第2个参数,该参数对象中的属性和方法将添加新对象中去。需要注意的是,第2个参数是一个对象或null
。当为对象时,看如下参数写法:
var obj3 = Object.create(obj, {
name: {
value: 'sxm'
}
})
obj3.sayName(); //sxm
而基于类型的继承,类似基于对象的继承,都是从一个已经存在的对象中继承,区别在于这里的继承是依赖原型的。因此,基于类型的继承是通过构造函数实现的,而非对象。具体实践:
function Person(name, age){
this.name = name;
this.age = age;
}
var subPerson = new Person();
这种继承,应该说更官方。也是ES6中的class继承的原始版本。复习下现在class的继承:
class Person{
constructor(name, age){
this.name = name;
this.age = age;
}
sayName() {
console.log(this.name);
}
}
class Student extends Person{
constructor(name, age, score){
super(name, age);
this.score = score;
}
}
var s = new Student('nitx', '30', 'A');
s.sayName(); //nitx
喜欢本文请扫下方二维码,关注微信公众号: 前端小二,查看更多我写的文章哦,多谢支持。