js学习笔记(8)——对象、类与面向对象编程

Li Guangqiao - 31/07/2023

js

对象、类与面向对象编程

理解对象

创建自定义对象的通常方式是创建Object的一个新实例:

let person = new Object(); 
person.name = "Nicholas"; 
person.age = 29; 
person.job = "Software Engineer"; 
person.sayName = function() { 
 console.log(this.name); 
};

//前面的例子
let person = { 
name: "Nicholas", 
age: 29, 
job: "Software Engineer", 
sayName() { 
console.log(this.name); 
} 
};

属性的类型

数据属性

查看对象属性的方式:Object.getOwnPropertyDescriptor方法

var obj = {
    "name":"test"
};
console.log(Object.getOwnPropertyDescriptor(obj, 'name'))

//output
//{ value: 'test', writable: true, enumerable: true, configurable: true }

修改属性的默认特性:Object.defineProperty方法,参数1:对象实例;参数2:属性名称;参数3:描述数据特性的对象

var obj = {
    "name": "test"
};
console.log(Object.getOwnPropertyDescriptor(obj, 'name'))
Object.defineProperty(obj,"name",{
    writable:false,
    value:"can't write"
});
console.log(Object.getOwnPropertyDescriptor(obj, 'name'))
console.log("1:",obj.name);
obj.name = "test";
console.log("2:",obj.name);
Object.defineProperty(obj,"name",{
    configurable:false,
    value:"can't delete"
});
console.log(Object.getOwnPropertyDescriptor(obj, 'name'))
delete obj.name;//严格模式下会抛出错误
console.log("3:",obj.name);

//output
/**
{value: 'test', writable: true, enumerable: true, configurable: true}

{value: 'can't write', writable: false, enumerable: true, configurable: true}

1: can't write

2: can't write

{value: 'can't delete', writable: false, enumerable: true, configurable: false}

3: can't delete
*/

注意:一个属性被定义为不可配置之后就不能再变会可配置的属性,再次调用Object.defineProperty()去修改非writable属性会导致错误

实际实验中,wriable修改同样会导致错误,故不确定是文档问题还是vscode的运行环境问题。

访问器属性

访问器属性不包含数据值。相反,它们包含一个获取(getter)函数和一个设置(setter)函数,不过这两个函数不是必需的。在读取访问器属性时,会调用获取函数,这个函数的责任就是返回一个有效的值。在写入访问器属性时,会调用设置函数并传入新值,这个函数必须决定对数据做出什么修改。访问器属性有 4 个特性描述它们的行为

访问器属性是不能直接定义的,必须使用Object.defineProperty()

let age = {
    fakeAge:27,
    realAge_:28
};
Object.defineProperty(age,"realAge",{
    get(){
        return this.realAge_;
    },
    set(newValue){
        this.realAge_ = newValue;
        this.fakeAge = this.realAge_-1;
    }
});
age.realAge = 29;
console.log(age,age.realAge,age.fakeAge);

//output
//{fakeAge: 28, realAge_: 29, realAge: <accessor>} 29 28

**注意:**获取函数和设置函数不一定都要定义。

let age = {
    fakeAge:27,
    realAge_:28
};
Object.defineProperty(age,"realAge",{
    get(){
        return this.realAge_;
    },
    // set(newValue){
    //     this.realAge_ = newValue;
    //     this.fakeAge = this.realAge_-1;
    // }
});
age.realAge = 29;
console.log(age.realAge,age.fakeAge);

//output
//28 27
let age = {
    fakeAge:27,
    realAge_:28
};
Object.defineProperty(age,"realAge",{
    // get(){
    //     return this.realAge_;
    // },
    set(newValue){
        this.realAge_ = newValue;
        this.fakeAge = this.realAge_-1;
    }
});
age.realAge = 29;
console.log(age.realAge,age.fakeAge);
//undefined 28
Li Guangqiao
Li Guangqiao

一个正在转rust的ExtJs前端工程师。迷信rust的整体发展,十分相信rust在各个领域都能发光发热,至少目前rust在很多领域上验证了其安全性、易维护性。但说实话对于我这种菜鸡也是真的难上手哈哈哈~~。 思路总结:

  • 万物诞生都会有一个需求来源,每一个改变都是为了解决某个问题,最后应该考虑如何去做
  • 学会掌握一些宏观的知识和理论:系统论、还原论
  • 工程化思想,如何描述整体,从整体架构到模块关联等 故学习东西应该像看地图一样,先看整体了解整体的结构,然后再聚焦每一个模块,对于模块的学习,思考三个问题,“是什么?”、“为什么?”、“怎么做?”;那么设计一个东西时也应该去考虑整体性和关联性。

有关于未来的发展,以下是鄙人的粗浅的观点:

  • 编程语言未来应该是每个人必备的工具
  • 未来的交互方式应该会以语言交互为主流
  • 下一个去中心化的技术方案出来之前,区块链依然是web3建立价值体系的基础技术方案,如何将现实价值和虚拟价值联通是进入数字世界的一个大难题。
  • 未来注定是AI的世界。AI的进化会伴随绝大部分人的退化,届时除了尖端人才,人们学习的重心会放在何处?