深入 JavaScript(4) - new运算符是如何工作的

接着上篇(//www.cnblogs.com/patrick-holynova/archive/2013/05/14/3077295.html), 来谈谈在OOP中重要的new运算.

JavaScript 不像高级语言C++, Java等本身就提供了对类的支持, 那么在Js中如何实现类, 类的实例?

  1. 对象字面量
  2. 用构造器创建

对象字面量, 例:

Detail = {'game': 'World of Warcraft','class':  'Priest','spell':   'Holy Nova'
}

 这种方式没什么好说的, 重点谈谈通过构造器创建实例.

什么是构造器? 前几篇已经说过很多遍了, 我们还可以叫它构造函数(下文开始都叫它构造函数了, 因为: ). 那么它自然是一个函数. 并且这个构造函数还带有一个名字是

prototype的属性, 这个属性指向的对象, 用于初始化实例的__proto__, 也就是说新的实例们继承了这个对象!

当然, 一个构造器还必须很多内部方法, 比如[[Construct]], 暂且不谈

构造函数须要通过 new 表达式来创建新对象. 如果不使用new, 则结果依赖于具体的构造函数的写法.

比如:

d1  = Date();    // "Mon May 20 2013 10:10:38 GMT+0800 (China Standard Time)"
// typeof d1 == 'string' , 产生了一个字符串, 不是一个'对象'.d2 = new Date();    // typeof d2 == 'object' , d2为一个对象

 每个由构造函数创建的对象, 都有一个隐式引用到构造函数的原型对象.

d2.__proto__ === Date.prototype;    // true
Object.getPrototypeOf(d) === Date.prototype;    // true

 ------------

new 运算是如何工作的呢?

我们先假设有这样一个构造函数:

var WOWCharacter = function(cName) {var level = 0;this.name = cName;this.getLevel = function() { return this. level; }this.setLevel = function(lv) { this.level = lv; return this.getLevel(); }  
}

 现在创建一个角色, 创建一个类的实例:

var subsidiaryCharacter = new WOWCharacter('巫喵王');
// 现在subsidiaryCharater对象是这样的
{name: '巫喵王',getLevel: function(){...},setLevel: function(){...}
}

 你可能会问, level 属性哪儿去了? 其实它是一个'私有变量', 是不能直接访问的, 这个我最在文章最后介绍一点, 不是本篇重点.

new 的执行过程

  1. 创建一个新的对象, obj = new Object();
  2. 调用 WOWCharacter 构造函数: 传入参数(如果有的话), 本例中为 ('巫喵王'), 并且令构造函数中的 this 为 创建的新对象 obj
  3. 如果构造函数返回了一个对象, 那么最终的新实例为这个对象(本例中, 构造函数无返回值, 通常也是这么做的, 不让其有返回值.)
    如果构造函数没有返回一个对象, 那么就让第1步中创建的对象 obj 为最终的返回值. subsidiaryCharacter = obj.

-- over --

new运算聊完了, 上面提到私有变量的问题, level 就是一个私有的变量, 只能通过'特权函数' getLevel, setLevel访问.

直接 subsidiaryCharacter.level 是取不到值的, 为什么? 闭包

下次谈谈Js中的闭包吧.

转载于:https://www.cnblogs.com/patrick-holynova/archive/2013/05/20/3088198.html

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

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

相关文章

计算机硬盘怎么设置ntfs,每次设置系统后,能否更改计算机硬盘分区的fat32和ntfs格式?...

f3622635硬盘的格式转换一个,FAT32到NTFS在“运行”中输入“ CMD”以打开“命令提示符”窗口,输入: “ CONVERT F: / FS: NTFS”,其中“ F: ”是分区驱动器号(带冒号),“ / FS: NTFS“是将指定的分区转换为NTFS格式.我认为它会很快…

python中_str_使用方法

定义__str__()方法: class Car: def __init__(self, newWheelNum, newColor): self.wheelNum newWheelNum self.color newColor def __str__(self): msg "嘿。。。我的颜色是" self.color "我有" int(self.wh…

LeetCode 708. 循环有序列表的插入

文章目录1. 题目2. 解题1. 题目 给定循环升序列表中的一个点,写一个函数向这个列表中插入一个新元素,使这个列表仍然是循环升序的。 给定的可以是这个列表中任意一个顶点的指针,并不一定是这个列表中最小元素的指针。 如果有多个满足条件的…

VMWare serve 2.0 进入 RHEL Linux rescue模式

可能由于我的鼠标点击速度比较慢所以一直没机会在 VMware Serve启动的时候按F2进入bios 模式,哈哈。 1.在次用另外一种方式: 2.进入bios 系统后,选择“boot”,再选"CD/ROM",上移到第一位。 3.在boot:后面输入…

计算机主页被篡改这是来自互联网的风险,IE主页为2345.com无法修改回来的解决方法...

X〒ⅠⅡⅢⅣφ〃IE主页为2345.com无法修改回来的解决方法近期,接到不少网友反馈,主页被改为2345.com了,改不回来,请问有何好的解决方法,现特地总结了些资料如下,供大家参考:1、IE默认连接首页被修改受到更改的注册表项目为:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft…

LeetCode 755. 倒水(模拟)

文章目录1. 题目2. 解题1. 题目 给出一个地形高度图, heights[i] 表示该索引处的高度。 每个索引的宽度为 1。在 V 个单位的水落在索引 K 处以后,每个索引位置有多少水? 水最先会在索引 K 处下降并且落在该索引位置的最高地形或水面之上。然…

python中的self含义及使用方法

self # 定义一个类 class Animal: # 方法 def __init__(self, name): self.name name def printName(self): print(名字为:%s%self.name) # 定义一个函数 def myPrint(animal): animal.printName() dog1 Animal(西西) myPrint(…

Galaxy s4怎么安装一个预装软件的签名不一致的新版本

公司新买一台galaxy s4,要测试一个软件。但是该软件在s4上面已经有预装版本了,无法安装。 用了下列方法才安装成功: 1. 请卖手机的帮忙获得root权限。 2. 检查s4是否已经root, 在手机上安装360安全卫士。然里面有工具->一键root&#xff0…

win10计算机修改底色,win10电脑如何修改登陆背景

win10中如何修改登陆时的背景图片?在win10中登陆界面的图片总是只有那几个背景图片,那登陆界面的背景图片能够更换么,答案是肯定的,下面小编就详细的给大家介绍一下背景更换的问题,希望能够帮助到大家。win10中更换登陆…

LeetCode 444. 序列重建(拓扑排序)

文章目录1. 题目2. 解题1. 题目 验证原始的序列 org 是否可以从序列集 seqs 中唯一地重建。 序列 org 是 1 到 n 整数的排列,其中 1 ≤ n ≤ 104。 重建是指在序列集 seqs 中构建最短的公共超序列。(即使得所有 seqs 中的序列都是该最短序列的子序列&am…

python中的保护对象数据

保护对象数据 查看过着修改对象的属性(数据),有2种方法。 直接通过对象名修改 通过方法间接修改 Python中没有像C中public和private这些关键字来区别公有属性和私有属性。它是以属性命名方式来区分,如果在属性名前面加了2个下划…

Highcharts 本地导出图片 Java

下载的 Highcharts-2.3.5.zip 解压后 有 E:\Highcharts\Highcharts-2.3.5\exporting-server\java 目录 提供了Java实现的导出应用。 1)安装maven,配置环境变量. (http://maven.apache.org/download.cgi) 1.jdk 我装的是E:\java\j…

华硕主板如何用u盘启动计算机,华硕主板怎么设置u盘启动都有哪些方法

随着互联网的不断发展,现在使用电脑的机会越来越多了。但是机器难免出故障,或者对于新的电脑需要设置启动。那么华硕主板怎么设置u盘启动。下面由一键工作室介绍一下。华硕主板怎么设置u盘启动华硕主板怎么设置u盘启动 华硕主板设置u盘启动方法1、首先&a…

LeetCode 353. 贪吃蛇(deque+set)

文章目录1. 题目2. 解题1. 题目 请你设计一个 贪吃蛇游戏,该游戏将会在一个 屏幕尺寸 宽度 x 高度 的屏幕上运行。 起初时,蛇在左上角的 (0, 0) 位置,身体长度为 1 个单位。 你将会被给出一个 (行, 列) 形式的食物位置序列。当蛇吃到食物…

python中__del__使用方法

创建对象后,python解释器默认调用__init__()方法。当删除一个对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法。在python中,对于开发者来说很少会直接销毁对象(如果需要,应该使用del关键字销毁)。Py…

html中post和get区别

HTTP协议中的GET和POST方法——二者主要区别如下: 1. get是从服务器上获取数据,post是向服务器传送数据。2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HT…

计算机简单故障时的排除方法,电脑简单故障排除解决办法大全

电脑简单故障排除解决办法大全一、电脑罢 工了?听报警声就可以处理故障!在使用电脑的时候,我们会经常遇到开机时电脑黑屏没有反应的情况,普通的电脑用户而对这样的故障实在是无从下手,但是一般电脑会有一个内部自检的功能,如果检…

LeetCode MySQL 1543. Fix Product Name Format(trim去空格+upper/lower大小写)

文章目录1. 题目2. 解题1. 题目 Table: Sales ----------------------- | Column Name | Type | ----------------------- | sale_id | int | | product_name | varchar | | sale_date | date | ----------------------- sale_id is the primary key for …

云计算之路-阿里云上:拔云见日的那一刻,热泪盈眶

当用路过秋天的压力测试工具重现问题的那一刻,热泪盈眶!这段时间所承受的一切一涌而出。。。 下面这张图是首次压力测试重现问题时的Windows性能监视器截图,我们对这样的图太熟悉了,当它一出现,就知道问题重现了。红色…

科润酒吧点单系统服务器配置,那些牛逼的酒吧都用什么管理系统?

原标题:那些牛逼的酒吧都用什么管理系统?关于酒吧你是熟悉还是陌生?对酒吧的管理系统?你接触的都有哪些?今天分享一个超大型酒吧的系统解决方案。宁波最大酒吧S86正式营业,视易娱加管理系统助力场所运营&am…