JavaScript 原型
在 JavaScript 中,原型是一个充当其他对象蓝图的对象。 JavaScript 中的每个对象都有一个原型,原型本身就是一个对象,其中包含该对象的所有实例共享的属性和方法。这个概念是 JavaScript 继承机制的核心。
1. 什么是原型?
每个 JavaScript 对象都有一个名为 [[Prototype]] 的内部属性。该属性引用另一个对象,它从该对象继承属性和方法。可以使用 __proto__ 属性(在大多数浏览器中)或 Object.getPrototypeOf() 访问对象的原型。
例如,当您创建一个新对象时,它会从其构造函数的原型对象继承属性和方法。
function Person(name, age) { this.name = name; this.age = age; } // Adding a method to the prototype of Person Person.prototype.greet = function() { console.log("Hello, " + this.name); }; const person1 = new Person("John", 30); person1.greet(); // Output: "Hello, John"
2. 原型链
在 JavaScript 中,对象在原型链中链接在一起。当在对象上调用属性或方法时,JavaScript 首先检查该属性或方法是否存在于对象本身上。如果没有,JavaScript 将检查对象的原型。如果在那里没有找到,JavaScript 会继续检查原型链,直到到达 Object.prototype,即根原型对象。如果仍未找到该属性或方法,则返回 undefined。
function Animal(name) { this.name = name; } Animal.prototype.speak = function() { console.log(this.name + " makes a noise."); }; function Dog(name) { Animal.call(this, name); // Inherit properties from Animal } Dog.prototype = Object.create(Animal.prototype); // Set the prototype chain Dog.prototype.constructor = Dog; // Fix the constructor reference const dog1 = new Dog("Buddy"); dog1.speak(); // Output: "Buddy makes a noise."
3. 向原型添加方法
可以将方法添加到构造函数的原型中,这使得该构造函数创建的所有实例都可以访问这些方法。这是定义共享方法的更有效方法,而不是将它们直接添加到每个实例。
function Car(make, model) { this.make = make; this.model = model; } // Adding a method to the prototype Car.prototype.displayInfo = function() { console.log(this.make + " " + this.model); }; const car1 = new Car("Toyota", "Corolla"); car1.displayInfo(); // Output: "Toyota Corolla"
4. 构造函数和原型关系
原型对象与构造函数紧密相关。当您使用 new 关键字创建对象的实例时,JavaScript 会将该实例的 [[Prototype]] 设置为构造函数的原型。
function Student(name, grade) { this.name = name; this.grade = grade; } Student.prototype.study = function() { console.log(this.name + " is studying."); }; const student1 = new Student("Alice", "A"); console.log(student1.__proto__ === Student.prototype); // true
5. 原型继承
原型继承允许一个对象从另一个对象继承属性和方法。这是 JavaScript 中面向对象继承的一种形式。通过将一个对象的原型设置为另一个对象的原型,第一个对象可以访问第二个对象的属性和方法。
function Person(name, age) { this.name = name; this.age = age; } // Adding a method to the prototype of Person Person.prototype.greet = function() { console.log("Hello, " + this.name); }; const person1 = new Person("John", 30); person1.greet(); // Output: "Hello, John"
6. Object.getPrototypeOf() 和 Object.setPrototypeOf()
JavaScript 提供了 Object.getPrototypeOf() 和 Object.setPrototypeOf() 方法来检索和修改对象的原型。但是,不建议在运行时更改原型,因为它可能会影响性能。
function Animal(name) { this.name = name; } Animal.prototype.speak = function() { console.log(this.name + " makes a noise."); }; function Dog(name) { Animal.call(this, name); // Inherit properties from Animal } Dog.prototype = Object.create(Animal.prototype); // Set the prototype chain Dog.prototype.constructor = Dog; // Fix the constructor reference const dog1 = new Dog("Buddy"); dog1.speak(); // Output: "Buddy makes a noise."
7. 原型与性能
虽然原型提供了一种共享方法和属性的有效方法,但在创建后更改对象的原型可能会带来性能缺陷。最佳实践是以运行时不需要修改的方式设置原型。
8. 要点总结
- 每个对象都有一个原型,这个原型也可能有一个原型,形成原型链。
- 原型是一个共享对象,对象从中继承属性和方法。
- 您可以在构造函数的原型中定义共享方法。
- JavaScript 中的继承 是通过将一个对象的原型链接到另一个对象的原型来实现的。
- Object.getPrototypeOf() 和 Object.setPrototypeOf() 允许您操作对象的原型。
结论
原型是 JavaScript 中的一项强大功能,可以实现高效的继承和方法共享。了解它们的工作原理对于编写更高效、面向对象的 JavaScript 代码至关重要。
嗨,我是 Abhay Singh Kathayat!
我是一名全栈开发人员,拥有前端和后端技术方面的专业知识。我使用各种编程语言和框架来构建高效、可扩展且用户友好的应用程序。
请随时通过我的商务电子邮件与我联系:kaashshorts28@gmail.com。
以上是了解 JavaScript 原型:继承和方法共享综合指南的详细内容。更多信息请关注PHP中文网其他相关文章!

javaandjavascriptaredistinctlanguages:javaisusedforenterpriseandmobileapps,while javascriptifforInteractiveWebpages.1)JavaisComcompoppored,statieldinglationallyTypted,statilly tater astrunsonjvm.2)

JavaScript核心数据类型在浏览器和Node.js中一致,但处理方式和额外类型有所不同。1)全局对象在浏览器中为window,在Node.js中为global。2)Node.js独有Buffer对象,用于处理二进制数据。3)性能和时间处理在两者间也有差异,需根据环境调整代码。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要区别在于类型系统和应用场景。1.Python使用动态类型,适合科学计算和数据分析。2.JavaScript采用弱类型,广泛用于前端和全栈开发。两者在异步编程和性能优化上各有优势,选择时应根据项目需求决定。

选择Python还是JavaScript取决于项目类型:1)数据科学和自动化任务选择Python;2)前端和全栈开发选择JavaScript。Python因其在数据处理和自动化方面的强大库而备受青睐,而JavaScript则因其在网页交互和全栈开发中的优势而不可或缺。

Python和JavaScript各有优势,选择取决于项目需求和个人偏好。1.Python易学,语法简洁,适用于数据科学和后端开发,但执行速度较慢。2.JavaScript在前端开发中无处不在,异步编程能力强,Node.js使其适用于全栈开发,但语法可能复杂且易出错。

javascriptisnotbuiltoncorc; saninterpretedlanguagethatrunsonenginesoftenwritteninc.1)javascriptwasdesignedAsalightweight,解释edganguageforwebbrowsers.2)Enginesevolvedfromsimpleterterterpretpreterterterpretertestojitcompilerers,典型地提示。

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

记事本++7.3.1
好用且免费的代码编辑器

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。