A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不二晨 金牌黑马   /  2019-1-13 12:02  /  480 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本篇主要讲下对象的属性与方法的修改问题。由于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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Object.create()方法还可以传入第2个参数,该参数对象中的属性和方法将添加新对象中去。需要注意的是,第2个参数是一个对象或null。当为对象时,看如下参数写法:

var obj3 = Object.create(obj, {
        name: {
            value: 'sxm'
        }
    })
obj3.sayName(); //sxm
1
2
3
4
5
6
而基于类型的继承,类似基于对象的继承,都是从一个已经存在的对象中继承,区别在于这里的继承是依赖原型的。因此,基于类型的继承是通过构造函数实现的,而非对象。具体实践:

function Person(name, age){
    this.name = name;
    this.age = age;
}

var subPerson = new Person();
1
2
3
4
5
6
这种继承,应该说更官方。也是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
---------------------
【转载,仅作分享,侵删】
作者: 一期一会
原文:https://blog.csdn.net/qq_34832846/article/details/86298527


1 个回复

倒序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马