JavaScript初学者必看“new”


Posted in Javascript onJune 12, 2017

译者按: 本文简单的介绍了new, 更多的是介绍原型(prototype),值得一读。

原文:JavaScript For Beginners: the ‘new' operator

译者: Fundebug

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习

当你使用new的时候,会:

1.创建一个新的空对象;
2.将this绑定到该对象;
3.添加一个名为__proto__的新属性,并且指向构造函数的原型(prototype);
4.返回该this对象。

如果你没有特别理解,那么我们接下来用例子来详细解释。首先定义一个构造函数Student,该函数接收两个参数nameage

function Student(name, age){
 this.name = name;
 this.age = age;
}

现在我们使用new来创建一个新的对象:

var first = new Student('John', 26);

到底发生了什么呢?

1.一个新的对象创建,我们叫它obj
2.this绑定到obj,任何对this的引用就是对obj的引用;
3.__proto__属性被添加到obj对象。obj.__proto__会指向Student.prototype
4.该obj对象被赋值给first变量。

我们可以通过打印测试:

console.log(first.name);
// John
console.log(first.age);
// 26

接下来深入看看__proto__是怎么回事。

原型(Prototype)

每一个JavaScript对象都有一个原型。所有的对象都从它的原型中继承对象和属性。

打开浏览器开发者控制面板(Windows: Ctrl + Shift + J)(Mac: Cmd + Option + J),输入之前定义的Student函数:

function Student(name, age) {
 this.name = name;
 this.age = age;
}

为了证实每一个对象都有原型,输入:

Student.prototype;
// Object {...}

你会看到返回了一个对象。现在我们来尝试定义一个新的对象:

var second = new Student('Jeff', 50);

根据之前的解释,second指向的对象会有一个__proto__属性,并且应该指向父亲的prototype,我们来测试一下:

second.__proto__ === Student.prototype
// true

Student.prototype.constructor会指向Student的构造函数,我们打印出来看看:

Student.prototype.constructor;
// function Student(name, age) {
// this.name = name;
// this.age = age;
// }

好像事情越来越复杂了,我们用图来形象描述一下:

JavaScript初学者必看“new”

Student的构造函数有一个叫.prototype的属性,该属性又有一个.constructor的属性反过来指向Student构造。它们构成了一个环。当我们使用new去创建一个新的对象,每一个对象都有.__proto__属性反过来指向Student.prototype

这个设计对于继承来说很重要。因为原型对象被所有由该构造函数创建的对象共享。当我们添加函数和属性到原型对象中,其它所有的对象都可以使用。

在本文我们只创建了两个Student对象,如果我们创建20,000个,那么将属性和函数放到prototype而不是每一个对象将会节省非常很多的存储和计算资源。

我们来看一个例子:

Student.prototype.sayInfo = function(){
 console.log(this.name + ' is ' + this.age + ' years old');
}

我们为Student的原型添加了一个新的函数sayInfo ? 所以使用Student创建的学生对象都可以访问该函数。

second.sayInfo();
// Jeff is 50 years old

创建一个新的学生对象,再次测试:

var third = new Student('Tracy', 15);
// 如果我们现在打印third, 虽然只会看到年龄和名字这两个属性,
// 仍然可以访问sayInfo函数。
third;
// Student {name: "Tracy", age: 15}
third.sayInfo();
// Tracy is 15 years old

在JavaScript中,首先查看当前对象是否拥有该属性;如果没有,看原型中是否有该属性。这个规则会一直持续,直到成功找到该属性或则到最顶层全局对象也没找到而返回失败。

继承让你平时不需要去定义toString()函数而可以直接使用。因为toString()这个函数内置在Object的原型上。每一个我们创建的对象最终都指向Object.prototype,所以可以调用toString()。当然, 我们也可以重写这个函数:

var name = {
 toString: function(){
 console.log('Not a good idea');
 }
};
name.toString();
// Not a good idea

创建的name对象首先查看是否拥有toString,如果有就不会去原型中查找。

总结

也许这些概念对你来说有点多,但是当你理解了,使用原型可以让你写出更加高效的代码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery选择器、属性设置用法经验总结
Sep 08 Javascript
js常用系统函数用法实例分析
Jan 12 Javascript
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
Feb 21 Javascript
javascript实现一个简单的弹出窗
Feb 22 Javascript
详解如何在React组件“外”使用父组件的Props
Jan 12 Javascript
Angularjs实现控制器之间通信方式实例总结
Mar 27 Javascript
vue的常用组件操作方法应用分析
Apr 13 Javascript
jQuery实现的手动拖动控制进度条效果示例【测试可用】
Apr 18 jQuery
JS实现的哈夫曼编码示例【原始版与修改版】
Apr 22 Javascript
React+Redux实现简单的待办事项列表ToDoList
Sep 29 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
Oct 31 Javascript
如何在vue-cli中使用css-loader实现css module
Jan 07 Vue.js
详解vue.js 开发环境搭建最简单攻略
Jun 12 #Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
Jun 12 #Javascript
微信小程序 实现点击添加移除class
Jun 12 #Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
Jun 12 #Javascript
微信小程序实现缓存根据不同的id来进行设置和读取缓存
Jun 12 #Javascript
利用Jasmine对Angular进行单元测试的方法详解
Jun 12 #Javascript
原JS实现banner图的常用功能
Jun 12 #Javascript
You might like
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
cache_lite试用
2007/02/14 PHP
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
phpword插件导出word文件时中文乱码问题处理方案
2014/08/19 PHP
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
TypeOf这些知识点你了解吗
2016/02/21 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
vue-hook-form使用详解
2017/04/07 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
2020/10/02 Javascript
[08:40]Navi Vs Newbee
2018/06/07 DOTA
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python返回昨天日期的方法
2015/05/13 Python
Python实现的破解字符串找茬游戏算法示例
2017/09/25 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
python 多进程共享全局变量之Manager()详解
2019/08/15 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
使用Pandas的Series方法绘制图像教程
2019/12/04 Python
Python对wav文件的重采样实例
2020/02/25 Python
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
2019年分享net面试的经历和题目
2016/08/07 面试题
机械电子工程毕业生自荐信
2013/11/23 职场文书
父亲生日宴会答谢词
2014/01/10 职场文书
市场开发与营销专业求职信范文
2014/05/01 职场文书
2014年保安个人工作总结
2014/11/13 职场文书
2014年维修电工工作总结
2014/11/20 职场文书
幼儿园欢迎词范文
2015/01/26 职场文书
2015年体育部工作总结
2015/04/02 职场文书
通讯稿范文
2015/07/22 职场文书
python3.7.2 tkinter entry框限定输入数字的操作
2021/05/22 Python
SpringBoot2零基础到精通之数据库专项精讲
2022/03/22 Java/Android