对象、类、与面向对象编程

2023-01-02 0 448

第一类、类、与面向第一类编程

优点类别 -那些都是js外部发动机的规范化表述无法发生改变 分成:统计数据优点和出访器优点 [[Configurable]] 与否能透过delete删掉 并再次表述,与否能修正它的优点,和与否能把它换成出访器优点,预设 是true

[[Enumerable]] 则表示优点与否能透过for-in循环式回到。间接表述在第一类的优点的那个优点都是true

[[Writable]] 则表示优点的值与否能被修正,预设为true

[[Value]] 包涵优点前述的值。加载和载入的边线,预设为undefined

/*要修正预设优点的预设优点 要采用 Object.defineProperty() 这个方式 转交3个模块要给其加进优点的第一类 优点的中文名称 两个配置文件第一类(配置文件第一类上的优点包涵) configurable\enumerable\writable\value 跟有关优点的中文名称相异。依照需要修正的优点,能增设当中两个或数个值*/ let person = {}; Object.defineProperty((person,“name”,{ writable:false, value:“Nicholas” })); console.log(person.name); person.name = Greg; console.log(preson.name)//Nicholas delete person.name; //类似规则也适用于创建不可配置的优点 console.log(preson.name)//Nicholas /* 出访器优点 出访器优点不包涵统计数据值, 他们包涵 gtter setter 函数,不够这两个函数不是必需的。[[Configurable]] 则表示优点与否能透过delete删掉并再次表述,与否能修正它的优点,和与否能把它改为统计数据优点。预设那个优点为true [[Enumerable]] 与否能透过 for-in循环式回到。 预设true[[Set]] 增设函数,在载入优点时调用,预设undefined */ /* 访问器优点是无法间接表述的,要采用Object.defineProperty()*/ //表述两个第一类,包涵伪私有成员year_那公共成员edition let book = { year_:2017, edition:1 }; Object.defineProperty(book,“year”,{ get() { return this.year_; }, set(newValue) { if(newValue > 2017) { this.year_ = newValue; this.edition += newValue 2017; } } }) book.year = 2018; console.log(book.edition);// 2 // /* 定义数个优点Object.defineProperties() 那个方式能透过数个配置文件一次性表述数个优点 2个模块,(要为之加进或者修正优点的第一类,另两个配置文件第一类,其优点与要加进和修正的优点相异。)*/ let look = {}; Object.defineProperties(book,{ year_:{ value:2017 }, edition:{ value:1 }, year:{ get(){ return this.year_; }, set(newValue) { if(newValue >2017) { this.year_ = newValue; this.edition += newValue 2017; } } } }) /**Object.getOwnPropertyDescriptor() * 加载优点 * @param {obj} 第一类 优点所在的第一类 * @param {str} 字符串 要取得其配置文件得优点名 * @param {obj} 回到是第一类 依照优点类别不同 回到得 优点也不同*/ let book = {}; Object.defineProperties(book,{ year_:{ value:2017 }, edition:{ value:1 }, year: { get: function() { return this.year_; }, set: function(newValue){ if(newValue > 2017) { this.year_ = newValue; this.edition += newValue 2017; } } } }) let descriptor = Object.getOwnPropertyDescriptor(book,“year_”); /* */ console.log(Object.getOwnPropertyDescriptors(book)); //es2017出的方式 会在每个自有优点上调用Object.getOwnPropertyDescriptor()并在两个新第一类中回到它们/** * 合并 * * assign() * @param {obj} 回到是第一类 两个或数个第一类 * * 先把每个原第一类 Object.propertyIsEnumerable()回到true * 和自有第一类的Object.hasOwnProperty()回到true)优点复制到目标第一类 * 采用原第一类的get 目标第一类的set * * 对第一类操作是浅复制, 如果数个源第一类都有相同的优点,则采用最后两个复制的值 */ let dest,src,result; dest = {id:dest}; result = Object.assign(dest,{id:src1,a:foo},{id:src2,b:bar}); //会覆盖之前相同的优点 console.log(reslut);//{ id: src2, a: foo, b: bar } // 能透过目标第一类上的增设函数观察到覆盖的过程:dest = { set id(x) { console.log(x); } }; Object.assign(dest, { id: first }, { id: second }, { id: third }); // first // second // third let dest ,src ,result; /** * 错误处理 */ dest = {}; src = { a: foo, get b () { //Object.assign()在 throw new Error(); }, c:bar }; try{ Object.assign(dest,src) } catch(e) { } // Object.assign()没办法回滚已经完成的修正// 因此在抛出错误之前,目标第一类上已经完成的修正会继续存在: console.log(dest); // { a: foo } //第一类的标识及相等判定 //那些是 === 符合预期的情况 console.log(true === 1); // false console.log({} === {}); // false console.log(“2” === 2); // false // 那些情况在不同JavaScript发动机中表现不同,但仍被认为相等console.log(+0 === 0); // true console.log(+0 === 0); // true console.log(0 === 0); // true // 要确定NaN的相等性,要采用极为讨厌的isNaN() console.log(NaN === NaN); // false console.log(isNaN(NaN)); // true //ES6 新增了 Object.is() 和===很像 /** * 判断与否相等 * * is() * @param {obj} 传参2个第一类 * */ console.log(Object.is(true, 1)); // falseconsole.log(Object.is({}, {})); // false console.log(Object.is(“2”, 2)); // false // 正确的0、-0、+0相等/不等判定console.log(Object.is(+0, 0)); // false console.log(Object.is(+0, 0)); // true console.log(Object.is(0, 0)); // false // 正确的NaN相等判定 console.log(Object.is(NaN, NaN)); // true //如果要检查数个值,递归地利用相等性传递即可 function recursivelyCheckEqual(x,…rest){ return Object.is(x,rest[0]) && (rest.lengt < 2 || recursivelyCheckEqual(…rest)) }

es6 优点值简写

let name = Matt; let person = { //name:name name };

es6 可计算优点

//old 之前想动态表述第一类key值 须要这么做 const namekEY = name; const ageKey = age; let person = {}; person[nameKey] = Matt; person[ageKey] = 27; console.log(person) // {name:Matt,age:27} //new es6 现在动态表述能这么写 let person = { [nameKey]: Matt, [ageKey]: 27 };

es6 简写方式名字

//old es5 let person = { sayName: function() { console.log() } } person.sayName(Matt);//My name is Matt //new es6 const methodKey = sayName; let person = { sayName(name) { console.log() } [methodKey](name) {// 简写方式名与可计算优点健相互兼容 console.log(1212) } } //配合计算优点本身能是复杂的表达式 const nameKey = name; const ageKey = age; const jobKey = job; let uniqueToken = 0; function getUniqueKey(key) { return `${key}_${uniqueToken++}`; } let person = { [getUniqueKey(nameKey)]: Matt, [getUniqueKey(ageKey)]: 27, [getUniqueKey(jobKey)]: Software engineer }; console.log(person); // { name_0: Matt, age_1: 27, job_2: Software engineer }

第一类解构

1.解构 同名能省略

2.解构能结构第一类优点和方式,把源统计数据结构转换为第一类,但是null和undefined无法被解构

3.解构 能同时进行表述预设值

4.解构 不要求变量要在解构表达式种声明,如果是事先声明,解构表达式要包涵在一对括号中

5.嵌套解构 解构对于嵌套优点或赋值目标没有限制,能透过复制第一类优点(浅拷贝)

6.嵌套解构 能采用嵌套结构进行解构

7.嵌套解构 外层优点没表述 源第一类/目标第一类都无法采用

8.第一类解构 如果解构中途出错,只会部分解构

9.第一类解构 在函数模块列表解构,不会对arguments有影响

let person = { name:Matt, age:27 }; let {name, age} = person; console.log(name); //Matt console.log(age); //27 //可以在解构 时候进行 同时进行表述预设值let person = { name:Matt, age: 27 }; let {name,job=Software engineer} = person; console.log(name); //Matt console.log(job); //Software engineer

创建第一类的几种方式

工厂模式

大众化 应用于软件工程
function createPerson(name,age,job) { let o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function () { console.log(this.name); } return o; } let person1 = createPerson(nicholas,29,“Software Engineer”); let person2 = createPerson(Greg,28,“Doctor”); function Person(name,age,job) { this.name = name; this.age = age; this.job = job; this.sayName = function () { console.log(this.name) } } let person1 = new Person(Nicholas,12,“student”) let person2 = new Person(Jack,11,“police”)

new 操作符都做了什么

(1) 在内存中创建两个新第一类。

(2) 那个新第一类外部的[[Prototype]]优点被赋值为构造函数的prototype优点。

(3) 构造函数外部的this被赋值为那个新第一类(即this指向新第一类)。

(4) 执行构造函数外部的代码(给新第一类加进优点)。

(5) 如果构造函数回到非空第一类,则回到该第一类;否则,回到刚创建的新第一类。

这是我在开课吧学习记下来的笔记,开课吧非常好,大家在一起直播上课,课上老师幽默风趣,贼逗乐,讲的通俗易懂。很牛逼,爱了爱了,课后微信群里大家交流很积极,助教小姐姐很耐心的教,啊哈哈哈哈

下面是我在开课吧上课的截图

对象、类、与面向对象编程

对象、类、与面向对象编程
下一篇: 宝塔

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务