对象补充-原型和函数原型-创建对象

news2024/9/27 21:29:41

defineProperties可以定义多个属性描述符

var obj = {
    // 私有属性(js里面是没有严格意义的私有属性)
    _age: 18,
    _eat: function() {}
}

Object.defineProperties(obj, {
    name: {
        configurable: true,
        enumerable: true,
        writable: true,
        value: "why"
    },
    age: {
        configurable: false,
        enumerable: false,
        get: function () {
            return this._age
        },
        set: function (value) {
            this._age = value
        }
    }
})
console.log(obj)
// 

对象方法补充

1、获取对象的属性描述符

  • getOwnPropertyDescriptor
  • getOwnPropertyDescriptors
var obj = {
    // 私有属性(js里面是没有严格意义的私有属性)
    _age: 18,
    _eat: function() {}
}

Object.defineProperties(obj, {
    name: {
        configurable: true,
        enumerable: true,
        writable: true,
        value: "why"
    },
    age: {
        configurable: false,
        enumerable: false,
        get: function () {
            return this._age
        },
        set: function (value) {
            this._age = value
        }
    }
})
// 获取某一个特定属性的属性描述符
console.log(Object.getOwnPropertyDescriptor(obj,'name'))
// 获取对象的所有属性描述符
console.log(Object.getOwnPropertyDescriptors(obj))

执行结果:

2、禁止对象扩展新属性:preventExtensions

3、禁止对象配置/删除里的属性

var obj = {
    name: 'why',
    age: 8
}

// 禁止对象继续添加新的属性
Object.preventExtensions(obj)

obj.height = 1.88
obj.address = "成都市"

console.log(obj)

Object.seal(obj)

delete obj.name

console.log(obj)

分别不注释Object.seal(obj)和注释Object.seal(obj)的结果

 4、让属性不可以修改

var obj = {
    name: 'why',
    age: 8
}

// 让属性不可以修改(writable:false)
Object.freeze(obj)

obj.name = 'kobe'
console.log(obj.name)

执行结果

创建多个对象的方案

工厂模式

  1. 工厂模式其实是一种常见的设计模式
  2. 通常我们会有一个工厂方法,通过该工厂方法我们可以产生想要的对象
// 工厂模式: 工厂函数
function createPerson(name, age, height, address) {
    var p = {}
    p.name = name
    p.age = age
    p.height = height
    p.address = address
    p.eating = function () {
        console.log(this.name + "在吃东西~")
    },
    p.running = function () {
        console.log(this.name + "在跑步!")
    }
    return p
}

var p1 = createPerson('张三', 18, 1.78, '北京市')
var p2 = createPerson('李四', 23, 1.88, '成都市')
var p3 = createPerson('王麻子', 28, 1.98, '重庆市')

// 工厂模式的缺点(获取不到对象最真实的类型)
console.log(p1, p2, p3)

构造函数

// 构造函数
function person(name, age, height, address) {
    this.name = name
    this.age = age
    this.height = height
    this.address = address
    this.eating = function () {
        console.log(this.name + "在吃东西~")
    },
    this.running = function () {
        console.log(this.name + "在跑步!")
    }
}

var p1 = new person('张三', 18, 1.78, '北京市')
console.log(p1)

规范:构造函数的首字母一般是大写

原型的概念

// 我们每一个对象都有一个[[prototype]],这个属性可以称之为对象的原型(隐式原型)

var obj = { name: 'why'}  // [[prototype]]
var info = {}  // [[prototype]]

// 1、解释原型的概念和看一下原型
// 早期的ECMA是没有规范如何查看[[prototype]]

// 给对象中提供了一个属性,可以让我们查看一下这个原型对象(浏览器提供)
// __proto__

// console.log(obj.__proto__)
// console.log(info.__proto__)

var obj = { name: 'why', __proto__: {}}

// ES5之后提供的Object.getPrototypeOf

// console.log(Object.getPrototypeOf(obj))


// 2、原型有什么用
// 当我们从一个对象中获取某一个属性时,它会触发[[get]]操作
// 1、在当前对象中去查找对应的属性,如果找到就直接使用
// 2、如果没有找到,那么会沿着它的原型去查找[[prototype]]
// obj.age = 18
obj.__proto__.age = 18

console.log(obj.age)

Person构造函数原型内存图

函数原型上的属性-constructor

赋值为新的对象

function foo() {
    
}

// foo.prototype这个对象中有一个constructor的属性
// console.log(foo.prototype)
// console.log(Object.getOwnPropertyDescriptor(foo.prototype))

// Object.defineProperty(foo.prototype, 'constructor', {
//     enumerable: true,
//     configurable: true,
//     writable: true,
//     value: "哈哈哈哈"
// })

// console.log(foo.prototype)

// prototype.constructor = 构造函数本身

// console.log(foo.prototype.constructor)  // [Function: foo]
// console.log(foo.prototype.constructor.name)

// console.log(foo.prototype.constructor.prototype.constructor.prototype.constructor)

// 2. 我们也可以添加自己的属性
// foo.prototype.name = "why"
// foo.prototype.age = 18
// foo.prototype.height = 180
// foo.prototype.eating = function () {
    
// }

// var f1 = new foo()
// console.log(f1.name, f1.age)

// 3.直接修改整个prototype
foo.prototype =  {
    // constructor: foo,
    name: "why",
    age: 18,
    height: 180
}

var f1 = new foo()
console.log(f1.name, f1.age, f1.height)

// 真实开发中我们通过Object.defineProperty方式添加constructor
Object.defineProperty(foo.prototype, 'constructor', {
    enumerable: true,
    configurable: true,
    writable: true,
    value: foo
})

创建对象方案-原型和构造函数

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

Person.prototype.eating = function() {
    console.log(this.name + "在吃东西~")
}

Person.prototype.running = function() {
    console.log(this.name + "在跑步~")
}


var p1 = new Person('why', 18, 1.88, '北京市')
var p2 = new Person('kobe', 20, 1.98, '洛杉矶市')

p1.eating()
p2.running()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1151303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试面试高频30道面试题

如果哪个测试经理在看我的文章,希望对面试者要微笑,不然面试结束,出门之后就一万个草泥马奔腾而过,其实面试者并不是希望你给他们什么,而是一种尊重,平等的谈话,不要高高在上感觉自己超牛逼一样…

二蛋赠书六期:《Linux管理入门经典(第8版)》

前言 大家好!我是二蛋,一个热爱技术、乐于分享的工程师。在过去的几年里,我一直通过各种渠道与大家分享技术知识和经验。我深知,每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此,我非常感激大家一直…

linux入门---线程的互斥

目录标题 什么是线程安全为什么会出现负数几个概念的介绍锁的理解锁有关函数的介绍锁的问题如何看待加锁和解锁锁的实现原理锁的封装线程安全和可重入函数死锁的概念 什么是线程安全 我们通过下面的例子来了解一下线程安全问题,首先我们实现一个模拟抢票的功能创建…

docker搭建halo个人博客

docker run -it -d --name halo -p 9090:8090 -v /usr/local/halo2:/root/.halo2 halohub/halo:2.10halo个人网站搭建效果 提供皮肤市场 编辑界面 自定义菜单

在win10下,使用torchviz对深度学习网络模型进行可视化

目录 1. 安装 graphviz 和 torchviz 2.安装 graphviz.exe 3.实例测试 4.如果你的电脑还是无法画图,并且出现了下面的报错: 5.参考文章: 1. 安装 graphviz 和 torchviz 首先打开 Anaconda prompt 进入自己的 pytorch 环境(图中 pt 是我自…

liunx练习题之在同一主机提供多个的web服务

虚拟web主机类型 一、基于端口 1.vim /etc/httpd/conf.d/vhost2.conf ---- — 改变http服务默认访问路径 <directory /testweb1>allowoverride none 表示不允许覆盖其他配置require all granted 表示允许所有请求 </directory> <virtualhost 0.0.0.0:…

【Leetcode】【简单】13. 罗马数字转整数

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/roman-to-integer/description/ …

【网络协议】聊聊套接字socket

网络编程我们知道是通过socket进行编程的&#xff0c;其实socket也是基于TCP和UDP协议进行编程的。但是在socket层面是感知不到下层的&#xff0c;所以在设置参数的时候&#xff0c;其实是端到端协议智商的网络层和传输层。TCP是数据流所以设置为SOCK_STREAM&#xff0c;而UDP是…

【配置环境】VS Code中JavaScript环境搭建

一&#xff0c;环境 Windows 11 家庭中文版&#xff0c;64 位操作系统, 基于 x64 的处理器VS Code 版本: 1.83.1 (user setup)Node.js 版本&#xff1a;20.9.0 二&#xff0c;为什么搭建JavaScript环境 因为在看《重构改善既有代码的设计第2版》的时候&#xff0c;书中的代码展…

嵌入式基础知识-RSA非对称加密基本原理

之前的文章嵌入式基础知识-信息安全与加密&#xff0c;介绍过数据加密的一些基本概念&#xff0c;对称加密的原理比较简单&#xff0c;加密和解密的密钥相同&#xff0c;而非对称加密&#xff0c;两个密钥不同&#xff0c;本篇就来具体介绍RSA这种非对称加密的密钥计算原理。 …

【PyQt学习篇 · ⑧】:QWidget - 窗口特定操作

文章目录 图标标题不透明度窗口状态最大化和最小化窗口标志案例 图标 setWindowIcon(QIcon("resource/header_icon.png"))&#xff1a;该函数用于设置QWidget的窗口图标。可以为窗口设置一个图标&#xff0c;以显示在窗口标题栏、任务栏或窗口管理器中。 windowIcon…

全面解析:oa系统是什么?有哪些好用的oa系统

oa系统是什么&#xff1f;有哪些好用的oa系统 一、什么是OA系统 OA系统全称为Office Automation&#xff0c;即办公自动化系统。它是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台&#xff0c;具有信息管理、流程管理、知识管理&#xff08;档案和业务管理&am…

视频剪辑软件Corel VideoStudio Ultimate 会声会影2024中文旗舰版免费下载安装步骤

我喜欢视频剪辑软件Corel VideoStudio Ultimate 会声会影2024中文旗舰版&#xff0c;因为它使用起来很有趣。它很容易使用&#xff0c;但仍然给你很多功能和力量。VideoStudio让我与世界分享我的想法&#xff01;“这个产品的功能非常多&#xff0c;我几乎没有触及它的表面&…

分布式系统之CAP理论

1. CAP 概念 CAP 概念指的是分布式系统中的三个核心属性&#xff1a;一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;、分区容错性&#xff08;Partition Tolerance&#xff09;。CAP 定理由计算机科学家 Eric Brewer 在 2000 年提出&…

keealived安装配置启动

1.keepalived作用和原理图 keepalived作用:解决单点故障简单原理图1: 2.keepalived安装配置启动 地址: https://www.keepalived.org/download.html# 1)解压 tar -zxvf keepalived-2.0.18.tar.gz # 2)进入keepalived目录 cd keepalived-2.0.18/ # 3)安装libnl/libnl-3依赖…

系统架构设计之云原生架构

云原生架构 一. 云原生技术介绍二. 传统架构模式 VS 云原生架构模式三. 云原生架构反模式四. 云原生架构设计原则 其它相关推荐&#xff1a; 软考系统架构之案例篇(架构设计相关概念) 系统架构之微服务架构 系统架构设计之微内核架构 鸿蒙操作系统架构 所属专栏&#xff1a;系统…

Tomcat简介 安装 站点部署 多实例配置 反向代理

一、Tomcat简介二 、Tomcat帮手 --- JDK安装jdk检查jdk是否安装成功 三.安装TomcatTomcat配置管理页面 四、web站点部署五、部署开源站点&#xff08;jspgou商城&#xff09;安装数据库 六、 jspgou商城上线配置数据库连接 七、Tomcat多实例配置复制程序文件浏览器访问 八、Tom…

3D LUT 滤镜 shader 源码分析

最近在做滤镜相关的渲染学习&#xff0c;目前大部分 LUT 滤镜代码实现都是参考由 GPUImage 提供的 LookupFilter 的逻辑&#xff0c;整个代码实现不多。参考网上的博文也有各种解释&#xff0c;参考了大量博文之后终于理解了&#xff0c;所以自己重新整理了一份&#xff0c;方便…

RT-Smart 开发笔记:int 类型数值溢出造成的奇怪问题的分析与排查记录

前言 最近在调试 RT-Smart 上的用户态 mq&#xff08;消息队列&#xff09;时&#xff0c;遇到一个奇怪的问题&#xff0c;这个例程打印了一下获取的时间&#xff0c;就可以正常的工作&#xff08;超时退出&#xff09;&#xff0c;否则&#xff0c;就一直卡住&#xff08;无法…