阅读 89

15个例子,全方位总结,Javascript如何面向对象

面向对象是一个老生常谈的话题了,如何使用JavaScript来实现面向对象呢?

本文将从JavaScript对象讲起,全方位阐述JavaScript如何操作对象,一定有你不知道的!

15个例子,全方位总结,Javascript如何面向对象

一.面向对象

1.检测属性

Object.hasOwnProperty("name")           //只检测到自身,不检测原型 "name" in a                             //检测a中的原型链是否包含name属性,检测自身和原型 复制代码

2.操作

delete Object.AttributeName Object.assign(object1,object2)          将俩个对象进行合并 Object.keys() Object.values() Object.entries()            获得数组,,一般是二维数组d'd'd'd for of 是操作迭代对象的,Object不可迭代 复制代码

3.设置原型

Object.setPrototypeOf(son,parent) 复制代码

//将a的原型设置为b let a = {     name : "a" } let b = {     name : "b" } Object.setPrototypeOf(a,b) 复制代码

1.多层对象的解构操作

保证左右结构相同

let hd = {     name : "后盾人",     lesson : {         title : "Javascript"     } } let {name,     lesson : {title} } = hd; console.log(name,title); 复制代码

2.解构赋值实现配置合并

使用对象的默认参数合并配置项

function creatEle(options = {}){     let {width = 200, height = 200 , backgroundColor = "green"} = options     let divs = document.createElement("div");     divs.style.width = width + "px";     divs.style.height = height + "px";     console.log(width,height,backgroundColor);     divs.style.backgroundColor = backgroundColor     document.body.appendChild(divs) } creatEle(); 复制代码

3.对象与原型链属性检测实例

let arr = ["Array","houdunren"] console.log(arr.hasOwnProperty("length"))   该方法检测自身,不检测原型 console.log("length" in arr)            该方法既检测原型,有检测自身 复制代码

4.计算属性与assign的使用

将数组转换为对象

let lessons = [     {         name : "css教程",         category : "css"     },     {         name : "php教程",         category : "php"     },     {         name : "java教程",         category : "java"     }, ] let obj = lessons.reduce((obj,cur,index) => {     obj[`${cur.category}-${index}`] = cur;     return obj },{}) console.log(obj); 复制代码

5.对象的浅拷贝多种操作方法

浅拷贝:不复制对象中的对象格式

let obj = {name : "",age:18,json:{}}        复制代码

方式一:(for-in):

let obj = {     name : "houdunren.com",     url : "hdcms" } let hd = {} for (const key in object) {     hd[key] = obj[key];  } 复制代码

方式二(Object.assign()):

 let obj = {     name : "houdunren.com",     url : "hdcms" } let hd = Object.assign({},obj) console.log(hd); 复制代码

方式三 : 展开语法

6.深拷贝多层次分析

我们将obj拷贝给hd,但是传递user的时候,由于user是一个对象,所以按址传递,obj和hd公用一个user,不是我们希望看到的结果

let obj = {     name : "houdunren.com",     user : {        age : 18     } } let hd = {...obj} console.log(hd); 复制代码

我们可以定义深拷贝函数

function copy(data){     //判断类型确定用数组还是对象接收数据     let obj = data instanceof Array ? [] : {}     //迭代数组     for (const [k,v] of Object.entries(data)) {         obj[k] = typeof v == "object" ? copy(v) : v;     }     return obj; } 复制代码

7.使用工厂函数创建对象

         function FactoryPerson(name,age,address) {             // 创建一个新的对象             var obj = new Object();             // 向对象添加属性             obj.name = name;             obj.age = age;             obj.address = address;             obj.sayHello = function () {                 console.log("I'm %s, and have %d years old. By the way, I live in %s",this.name,this.age,this.address)             }             // 返回新的对象             return obj;         } 复制代码

8.面对对象的封装与抽象

使用this定义的属性可以通过外部访问,通过变量定义的属性不可以访问(实现抽象)

function User(name,age){     this.name = name;     this.age = age;     let show = function(){         console.log(name + age);     } } let hd = new User("湘军",18) hd.show(); 复制代码

9.对象的属性特征

const usr = {     name : "houdunren",     age : 18 } 复制代码

1.获取属性特征:

Object.getOwnPropertyDescriptor(user,name) Object.getOwnPropertyDescriptors(user) 复制代码

2.修改属性特征:

Object.defineProperty(user,name,{config}) Object.defineProperties(user,{}) 复制代码

3.属性操作:

Object.preventExtensions(user);         //禁止向对象中添加属性 Object.isExtensible()                   //检测对象是否是可扩展的 Object.seal()                           //封闭对象,不可添加不可配置 Object.isSealed()                       //判断是否封闭 Object.freeze()                         //冻结对象,不可修改不可添加不可配置 Objcet.isFrozen()                       //判断是否冻结 复制代码

10.使用set,get访问器保护数据

访问器优先级高

const user = {     data : {name : "houdunren" , age : 18},     set age(value){         if(typeof value != "number" || value > 100 || value < 10){             console.log("输入的值并不正确")         }         this.data.age = value;     }     get age(){         return this.data.age;     } } user.age = 5; 复制代码

11.使用 token保存登录信息

let Request = {     set token(content){         localStorage.setItem("token",content);     },     get token(){         let token = localStorage.getItem("token");         if(!token){             alert("请登陆")         }         return token;     } } Request.token(); console.log(Request.token); 复制代码

12.什么是Proxy代理拦截

访问器是对对象的属性进行代理,而Proxy相当于买房子的中介,不直接操作对象

let obj = {     name : "海景房",     price : 18500 } //新建一个代理,告诉他我要代理海景房 let proxy = new Proxy(obj,{     get(obj,property){         return obj[property]     },     set(obj,property,value){         obj[property] = value;     } }); proxy.name = "海景房2" console.log(proxy); console.log(proxy.price) 复制代码

13.使用 Proxy.apply代理函数

Proxy.apply(func,obj,args)

function factorial(num){     return num === 1 ? 1 : num * factorial(num-1); } let proxy = new Proxy(factorial,{     //第一个是要代理的函数,第二个是对象的作用域,第三个是传递的参数(必须用数组的形式)     apply(func,obj,args){         console.time("run")         func(args)         console.timeEnd("run")          } }) 复制代码

14.数组使用代理拦截

let lessons = [     {         title : "css课程",         number : "1084350607"     },     {         title : "java教程",         number : "1091525714"     },     {         title : "php全面教学",         number : "1091525714"     } ] let proxy = new Proxy(lessons,{     get(array,key){         let number = array[key].number;         const length = 3;         array[key].number = number.length >= length              ? number.substr(0,3) + "*".repeat(number.length-length)              : number;         return newAry;     } });     console.log(proxy[2]); 复制代码

15.VUEJS数据绑定实现,使用Proxy实现数据双向绑定

相当于房东告诉代理,房价发生了变化,代理告诉多个购房用户价格发生了变化。

    <input type="text" data_title = "title">     <input type="text" data_title = "title">     <div data_title = "title">更新数据</div> 复制代码

function View(){     let ele = document.querySelectorAll("[data_title]")     let proxy = new Proxy({},{         set(obj,property,value){            ele.forEach(item => {                item.value = value            })                       },         get(obj,propert){         }     });     this.init = function(){                 ele.forEach(item => {             item.addEventListener("keyup",function(){                 proxy[this.getAttribute("data_title")] = this.value;             })         })     } } new View().init()


作者:久染
链接:https://juejin.cn/post/7028190322643435557


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐