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 相关文章推荐
Chrome中模态对话框showModalDialog返回值问题的解决方法
May 25 Javascript
基于jquery的复制网页内容到WORD的实现代码
Feb 16 Javascript
JavaScript解析URL参数示例代码
Aug 12 Javascript
js中哈希表的几种用法总结
Jan 28 Javascript
通过url查找a元素应用案例
Apr 29 Javascript
jQuery插件开发详细教程
Jun 06 Javascript
JavaScript获取页面中第一个锚定文本的方法
Apr 03 Javascript
Javascript实现苹果悬浮虚拟按钮
Apr 10 Javascript
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
Oct 26 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
Mar 26 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
Jul 26 Javascript
多个Vue项目部署到服务器的步骤记录
Oct 22 Javascript
详解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
php生成过去100年下拉列表的方法
2015/07/20 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
2017/03/24 PHP
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
Javascript原型链和原型的一个误区
2014/10/22 Javascript
重写document.write实现无阻塞加载js广告(补充)
2014/12/12 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
js获取form的方法
2015/05/06 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
JQuery标签页效果的两个实例讲解(4)
2015/09/17 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
jQuery对html元素的取值与赋值实例详解
2015/12/18 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
CentOS 安装NodeJS V8.0.0的方法
2017/06/15 NodeJs
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
2020/04/07 Javascript
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
使用python编写监听端
2018/04/12 Python
Python使用Pandas对csv文件进行数据处理的方法
2019/08/01 Python
python+requests接口压力测试500次,查看响应时间的实例
2020/04/30 Python
HTML5本地存储之Web Storage详解
2016/07/04 HTML / CSS
乐高积木玩具美国官网:LEGO Shop US
2016/09/16 全球购物
StubHub哥伦比亚:购买和出售您的门票
2016/10/20 全球购物
加拿大当代时尚服饰、配饰和鞋类专业零售商和制造商:LE CHÂTEAU
2017/10/06 全球购物
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
英国在线泳装店:Simply Swim
2019/05/05 全球购物
C#里面如何判断一个Object是否是某种类型(如Boolean)?
2016/02/10 面试题
银行服务感言
2014/03/01 职场文书
《三个小伙伴》教学反思
2014/04/11 职场文书
倡议书格式范文
2014/04/14 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
民间借贷协议书范本
2014/10/01 职场文书
单位接收证明格式
2015/06/18 职场文书
Java并发编程之原子性-Atomic的使用
2022/03/16 Java/Android
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL