当前位置: 首页 > news >正文

js高级属性

js对象高级属性

每个对象里面都有个默认get``set方法,
get:获取属性方法
set:修改属性方法

1.writable是否可更改,还是只读

let prson = {};//注意这里是defineProperty而不是defineProperties
//defineProperty第一个参数是对象名,第二参数对象属性名,第三个是属性值的对象
Object.defineProperty(prson, "name", {
            writable: false,//这里设置false是不允许修改的
            value: '奥术大师'
 })
        console.log(prson);
        prson.name='胜多负少的'
        console.log(prson);

在这里插入图片描述

2.configurable是否可以删除如果为false则不能删除,也不能修改

 let prson = {};
        Object.defineProperty(prson, "name", {
            configurable: true,
            value: '奥术大师1'
        })
        delete prson.name //先删除
        console.log(prson);
        prson.name = '胜多负少的'	//再赋值
        console.log(prson);

在这里插入图片描述
3.Enumaerable枚举

 var obj = { a: 1, b: 2 };
        obj.c = 3;
        Object.defineProperty(obj, 'd', {
            value: 4,
            enumerable: false
        });
        console.log(obj);
       for (var key in obj) console.log(obj[key]); 

在这里插入图片描述

如果使用Enumaerable那么下面三种方法是无法检测到改属性

  • for…in循环
    Object.keys方法
    JSON.stringify方法

访问器属性

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

定义一个对象对象里面包含伪私有成员,公共成员,私有成员

let obj={
	year_:'伪私有成员',
	age:18//公共成员
	_name:'私有成员',
}

这里面主要区分 _ 的作用,这种写法是约定俗成的并不是一定是这样

访问器属性里面有默认的getter setter访问器属性是优先于数据属性

  • 访问器属性也有4个特征(configurable,enumerable,get,set)
  • 不能直接定义,需要使用Object.defineProperty()来定义;__proto__就是一个访问器属性,不能对其随意设置的,会有拦截。

工厂模式创建对象缺点,创建所有的对象都是object类型,无法进一步区分(obj对象赋值)

这个相当于我创建了无数个人,然后在每个人身上安装2个眼睛一个鼻子

 function createObj(name, age, adress) {
            var o = new Object();//每个创建的都是值得这个对象类型也只能是对象类型
            o.name = name;
            o.age = age;
            o.getName = function () {
                return this.name
            }
            o.adress = adress;
            return o
        }
        let aa = createObj('creaObj', 18, {
            name: '我创建的对象',
            code: '10000'
        });
        let aa2 = createObj('creaObj', 18, {
            name: '我创建的对象',
            code: '10000'
        });
        console.log(aa.getName === aa2.getName);//false

这是一段构造函数构建的对象每个对象都开辟一个地址,这是缺点(this赋值)

这个打个比方就相当于我创建了n个对象每个对象都从我这里拿眼睛和鼻子 ,那么基本属性都是眼睛和鼻子,复杂属性至于眼睛和鼻子安装没安装那就是不同的结果,有的只安装了一个眼睛

function Person() {
            this.name = "cao";
            this.age = 18
            this.adress = {
                name: '伤害哦',
                code: '109001'
            }
            this.getName = function () {
                return this.name
            }
        }
        // 生成两个实例
        var person = new Person()
        var person2 = new Person()
        console.log(person.adress === person2.adress);//false  同样的方法开辟了两个空间
        console.log(person.name === person2.name);//true

基于原型对象创建(prototype)

这个打个比方就相当于在人的磨具原型添加眼睛和鼻子,每个人拿到磨具就赋值的一样的

        function Person() {
            Person.prototype.name = "cao";
            Person.prototype.age = 18
            Person.prototype.adress = {
                name: '伤害哦',
                code: '109001'
            }
            Person.prototype.getName = function () {
                return this.name
            }
        }
        // 生成两个实例
        var person = new Person()
        var person2 = new Person()
        console.log(person.getName === person2.getName);//true
        console.log(person.name === person2.name);//true

构造函数和原型混合的模式

构造函数和原型混合的模式是目前最常见的创建自定义类型对象的方式
构造函数中用于定义实例的属性,原型对象中用于定义实例共享的属性和函数,通过构造函数传递参数,这样每个实例都能拥有自己的属性值,同时实例还能共享函数的引用,最大限度节约内存的空间,混合模式可谓集二者之所长

   // 构造函数 不共享
        function createObj(name, age, adress) {
            this.name = name
            this.age = age
            this.adress = adress
        }
        // 原型 共享属性
        createObj.prototype.getName = function () {
            return this.name
        }
        var aa = new createObj('zjb', 18, {
            name: '上海',
            code: 1000
        })
        var aa2 = new createObj('zjb2', 118, {
            name: '上海1',
            code: 10001
        })
        console.log(aa.getName === aa2.getName);

相关文章:

  • ISP和IAP介绍
  • 基于R语言、MATLAB、Python机器学习方法与案例分析
  • 基于php+MYSQL的旅游景点攻略的设计与实现毕业设计源码301216
  • 猿创征文|【Typescript入门】常用数据类型(2)
  • 上新啦!腾讯云云原生数据湖产品DLC 2.2.5版本发布,来看特性详解!
  • 【观察】赋能中小企业驶入成长“快车道”,华为云云商店背后的三重新价值...
  • TVM 学习指南(个人版)
  • pringboot+高考志愿填报信息管理系统 毕业设计-附源码251922S
  • python基于django的花卉种植技术交流系统
  • FastFlow(3)---有序FARM
  • Springboot餐饮点餐系统毕业设计源码301749
  • 借身份证给别人办理流量卡有风险吗?这些情况你必须要知道!
  • 概述LCR测试仪IM3536日本HIOKI日置IM3535 阻抗分析仪
  • qiankun微应用加载第三方js、sdk跨域报错
  • Linux网络编程-网络层IP协议
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【Linux系统编程】快速查找errno错误码信息
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • C# 免费离线人脸识别 2.0 Demo
  • download使用浅析
  • emacs初体验
  • EventListener原理
  • flutter的key在widget list的作用以及必要性
  • git 常用命令
  • Java 网络编程(2):UDP 的使用
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Java到底能干嘛?
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Python学习之路13-记分
  • SpriteKit 技巧之添加背景图片
  • Zsh 开发指南(第十四篇 文件读写)
  • 产品三维模型在线预览
  • 机器学习 vs. 深度学习
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 算法系列——算法入门之递归分而治之思想的实现
  • 7行Python代码的人脸识别
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)ssm高校实验室 毕业设计 800008
  • (四)Linux Shell编程——输入输出重定向
  • (转)ORM
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • ***详解账号泄露:全球约1亿用户已泄露
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET 的程序集加载上下文
  • .NET 分布式技术比较
  • .NET建议使用的大小写命名原则
  • .NET中统一的存储过程调用方法(收藏)
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • /3GB和/USERVA开关
  • [autojs]逍遥模拟器和vscode对接
  • [BJDCTF2020]The mystery of ip1