JavaScript初学者必看“new”

发布时间 - 2026-01-11 01:50:23    点击率:

译者按: 本文简单的介绍了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;
// }

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


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,如果有就不会去原型中查找。

总结

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

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


# js  # new  # JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题  # Extjs学习过程中新手容易碰到的低级错误积累  # 7个你应该知道的JS原生错误类型  # 详解JavaScript错误捕获  # JavaScript语句错误throw、try及catch实例解析  # JS常见错误(Error)及处理方案详解  # JS错误处理与调试操作实例分析  # javascript 初学教程及五子棋小程序的简单实现  # JavaScript初学者容易犯的几个错误  # 都有  # 创建一个  # 让你  # 当你  # 当我们  # 绑定  # 到该  # 的是  # 会有  # 将会  # 也没  # 你会  # 就不  # 又有  # 对你  # 要去  # 我们可以  # 版权归  # 这两个  # 只会 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 微信推文制作网站有哪些,怎么做微信推文,急?  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Laravel API资源类怎么用_Laravel API Resource数据转换  Laravel怎么使用artisan命令缓存配置和视图  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  简单实现Android文件上传  重庆市网站制作公司,重庆招聘网站哪个好?  浅谈redis在项目中的应用  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  微信小程序 require机制详解及实例代码  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  高防服务器:AI智能防御DDoS攻击与数据安全保障  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  如何在宝塔面板创建新站点?  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  在Oracle关闭情况下如何修改spfile的参数  如何快速生成凡客建站的专业级图册?  Java垃圾回收器的方法和原理总结  ,怎么在广州志愿者网站注册?  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  JavaScript中的标签模板是什么_它如何扩展字符串功能  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  如何确认建站备案号应放置的具体位置?  三星网站视频制作教程下载,三星w23网页如何全屏?  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  高防服务器如何保障网站安全无虞?  如何在Windows 2008云服务器安全搭建网站?  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  实例解析Array和String方法  如何实现javascript表单验证_正则表达式有哪些实用技巧  如何基于PHP生成高效IDC网络公司建站源码?  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)