首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js原型的语法

JavaScript 原型(Prototype)是 JavaScript 中实现对象继承的一种机制。每个 JavaScript 对象都有一个指向其原型对象的内部链接。这个原型对象又有自己的原型,如此层层向上,直到达到 Object 构造函数的原型对象,这个原型对象的值是 null,形成了一个原型链。

语法

  1. 创建原型

可以通过构造函数的 prototype 属性来设置或获取对象的原型。

代码语言:txt
复制
function Person(name) {
    this.name = name;
}

Person.prototype.sayHello = function() {
    console.log('Hello, my name is ' + this.name);
};
  1. 访问原型

可以通过对象的 __proto__ 属性(非标准,但广泛支持)或 Object.getPrototypeOf() 方法来访问一个对象的原型。

代码语言:txt
复制
var p = new Person('Alice');
console.log(p.__proto__ === Person.prototype); // true
console.log(Object.getPrototypeOf(p) === Person.prototype); // true
  1. 原型链

当访问一个对象的属性时,JavaScript 引擎首先会在对象本身查找这个属性。如果找不到,它会沿着 __proto__ 链向上查找,直到找到该属性或达到原型链的顶端(null)。

代码语言:txt
复制
console.log(p.name); // Alice,直接在 p 对象上找到
console.log(p.sayHello); // [Function: sayHello],在 p 的原型上找到
console.log(p.toString()); // [Function: toString],在原型链上更上层找到

优势

  • 实现继承:通过原型链,可以实现对象之间的继承关系。
  • 共享属性和方法:所有实例共享原型上的属性和方法,节省内存。

类型

  • 构造函数原型:通过构造函数的 prototype 属性设置。
  • 对象字面量原型:通过 Object.create() 方法创建的对象可以指定其原型。

应用场景

  • 创建多个具有相同属性和方法的对象:通过构造函数和原型实现。
  • 实现继承:通过设置子类的原型为父类的实例来实现继承。

常见问题及解决方法

  1. 原型链断裂:当修改一个对象的原型时,可能会导致原型链断裂。解决方法是谨慎修改原型,或使用 Object.setPrototypeOf() 方法。
  2. 性能问题:过长的原型链可能导致性能下降。解决方法是保持原型链简短,避免不必要的继承层次。
  3. 属性遮蔽:当在对象本身定义一个与原型上同名的属性时,会遮蔽原型上的属性。这是预期的行为,但需要注意不要意外覆盖重要属性。

了解 JavaScript 原型对于掌握这门语言至关重要,它不仅是实现继承的基础,也是理解对象和函数之间关系的关键。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【JS 构造|原型|原型链|继承(圣杯模式)|ES6类语法】上篇

Git专栏:Git篇 JavaScript专栏:js实用技巧篇,该专栏持续更新中,目的是给大家分享一些常用实用技巧,同时巩固自己的基础,共同进步,欢迎前来交流 你的一键三连是对我的最大支持 ❤️...文章目录 ✔️前言 内容 构造函数 原型 原型链 总结 ✔️前言 ❗️ ❗️ ❗️本篇系将带来JavaScript中的构造——原型——原型链——继承——ES6类语法系列知识完整讲解。...❗️ ❗️ ❗️ ❕上篇涉及:构造——原型——原型链 ❕下篇涉及:继承——ES6类语法 内容 构造函数 何为构造函数?...由于JS中所有对象都是通过new产生的,因此,严格来说,JS中所有对象都称之为实例 //例: const obj = { a:'0', b:'1', c:'2' } //上面等价于var obj =...={ a:'hello', b:66, } Object.setPrototypeOf(obj1,null); console.log(obj1); 总结 js构造函数到原型及原型链的部分对初学者比较抽象

73920

【JS 构造|原型|原型链|继承(圣杯模式)|ES6类语法】下篇

Git专栏:Git篇 JavaScript专栏:js实用技巧篇,该专栏持续更新中,目的是给大家分享一些常用实用技巧,同时巩固自己的基础,共同进步,欢迎前来交流 你的一键三连是对我的最大支持 ❤️...文章目录 ✔️前言 内容 继承 伪经典模式/圣杯模式 类语法 总结 ✔️前言 ❗️ ❗️ ❗️本篇系将带来JavaScript中的构造——原型——原型链——继承——ES6类语法系列知识完整讲解。...❗️ ❗️ ❗️ ❕上篇涉及:构造——原型——原型链 ❕下篇涉及:继承——ES6类语法 内容 继承 初认识 此处我们就以通常在各种平台所见到的会员与非会员举例: 普通会员 属性:用户名、密码 方法:...如何在JS中封装继承?...ES6之前,函数有着两种调用方式: function A(){} A(); // 直接调用 new A(); // 作为构造函数调用 这种做法无法从定义上明确函数的用途,因此,ES6推出了一种全新的语法来书写构造函数

73110
  • js中的原型和原型链

    ​一、原型 1、prototype和constructor 在js中每个函数(非箭头函数,一般关于原型的有关知识我们都只考虑构造函数)都会拥有一个 prototype 属性,该属性值是一个对象...__proto__) // true 二、原型链 原型链:《JavaScript高级程序设计》中的描述是:每个构造函数都有一个原型对象,如果该原型是另一个类型的实例呢?...原型链中的查找机制:实例对象上找不到指定属性,就从该原型对象上找,如果还是找不到就到该原型对象上的原型上去找,。...关于Object.getPrototypeOf() 返回指定对象的原型(内部[[Prototype]]属性的值),参数为要返回其原型的对象。...第一个参数是:要设置其原型的对象;第二个参数是:该对象的新原型(一个对象或 null)。

    1.1K00

    JS中的原型和原型链

    讲原型的时候,我们应该先要记住以下几个要点,这几个要点是理解原型的关键: 1、所有的引用类型(数组、函数、对象)可以自由扩展属性(除null以外)。...2、所有的引用类型都有一个’_ proto _'属性(也叫隐式原型,它是一个普通的对象)。 3、所有的函数都有一个’prototype’属性(这也叫显式原型,它也是一个普通的对象)。...---- 那么要点说完了,我们就根据这些要点来理解原型和原型链。 原型 我们先来看一个原型的例子。...所以当fn调用toString()时,JS发现fn中没有这个方法,于是它就去Foo.prototype中去找,发现还是没有这个方法,然后就去Object.prototype中去找,找到了,就调用Object.prototype...这就是原型链,fn能够调用Object.prototype中的方法正是因为存在原型链的机制。

    1.8K21

    JS中的原型和原型链

    js在创建对象的时候,都有一个叫做proto的属性,用于指向它的函数对象的原型对象prototype。 prototype可以让所有的对象实例共享它包含的属性和方法。...原型链 每一个对象都可以有一个原型,这可原型还可以有它自己的原型,以此类推,就形成了原型链。...查找一个对象的属性或方法的时候,如果这个对象中没有这个属性或者方法,那就会在这个对象的原型对象中去找,以此类推,直到原型链结束。..._proto_ _proto_是原型链查询中实际用到的,指向构造函数的原型对象,他是对象独有的。对象._proto_ = 构造函数.prototype。 在js中,万物皆是对象,函数也是对象。...3、构造函数的prototype指向原型对象,原型对象的constructor指向构造函数。 使用 prototype最主要的用法就是将属性暴露成公用的。

    1.5K10

    JS原型与原型链

    值得注意的是typeof (null)会返回Object,这是因为JS二进制前三位都为0的话会被判断为Object类型,null的二进制表示是全0,自然前三位也是0,所以执行typeof时会返回Object...,它总是指向prototype,就是指向构造函数Student的原型对象prototype。...例如实例化的stu会使用__proto__向Student的prototype寻找方法或属性。若stu寻找到了调用的方法或属性,则不会使用__proto__寻找原型对象。...原型链可以简单理解为将原型连成一条链,js每一次获取对象中的属性都是一次查询过程,如果在自有属性中找不到就会去原型对象中查找,如果原型对象中还查不到,就回去原型对象的原型中查找,也就是按照原型链查找,...直到查找到原型链的顶端,也就是Object的原型。

    1.8K50

    js原型和原型链

    (prototype) 每个函数都有一个 prototype 属性 每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型对象prototype ,...但是当我们删除了 person 的 name 属性时,读取 person.name,从 person 对象中找不到 name 属性就会从 person 的原型也就是 person....原型和原型链 一张图搞懂: 函数与 Function 的关系 函数就是 Function 的实例....Object可以使用__proto__来访问对象的原型对象,即Object可通过__proto__访问Function的Function.prototype 原型继承的整个关系( 原型链 ) 可以知道所有的对象都有原型...__proto__ === Object.prototype); // true 应用 继承 看我这篇文章:js实现继承 增删查改 function Person() { } // 增 Person.prototype.name

    2.1K10

    js对象和原型、原型链的关系

    JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个概念一知半解,碰到问题靠...) // 获取foo.prototype的原型foo__proto__ === Object.prototype // true foo.prototype的原型是Object.prototype如果用以前的语法...判断方式有两种,但都是根据构造函数的prototype是否在原型链上来判断的:instanceof: 用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置语法:object instanceof...// true Object.prototype在testObject的原型链上isPrototypeOf:测试一个对象是否存在于另一个对象的原型链上语法:prototypeObj.isPrototypeOf...拒绝查找原型链:hasOwnProperty: 指示对象自身属性中是否具有指定的属性语法:obj.hasOwnProperty(prop)参数: prop 要查找的属性返回值: 用来判断某个对象是否含有指定的属性的

    1.5K20

    JS面试必问-JS原型及原型链

    为什么需要原型 在js中万物皆对象,对象可以说是重中之重了。每一个对象都拥有自己的属性。但是在这个世界中有很多东西都是相似的,可以归为一类,他们有共同的方法和属性。不可能让每一个对象都定义一个属性吧。...所以,在js中怎么才能让多个对象共享一个或多个方法呢?原型的出现就是为了解决这个问题。...我们上面讲过,js每一次获取对象中的属性都是一次查询过程,如果在自有属性中找不到就会去原型对象中查找,如果原型对象中还查不到,就回去原型对象的原型中查找,也就是按照原型链查找,直到查找到原型链的顶端,也就是...在js中,对象都有__proto__属性,一般这个是被称为隐式的原型,该隐式原型指向构造该对象的构造函数的原型。...而所有的函数都是构造函数Function的实例。从原型链机制的的角度来说,那就是说所有的函数都能通过原型链找到创建他们的Function构造函数的构造原型Function.protorype对象。

    1.6K20

    JS进阶:原型与原型链

    JS进阶:原型与原型链 image.png JavaScript中除了基础数据类型外都是对象(引用类型)。...但是由于其没有类(ES6 引入了 class,但其只是语法糖)的概念,为了保证对象之间的联系,就有了原型和原型链的概念。...该原型对象也有一个自己的原型对象( __proto__ ) ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。...而原型对象自身也是一个对象,它也有自己的原型对象,这样层层上溯,就形成了一个类似链表的结构,这就是原型链(prototype chain)。...Objec.prototype指向的原型对象同样拥有原型,不过它的原型是null,而null则没有原型。

    1.4K30

    js原型及原型链解析

    js原型、原型链 这几天闲了看了下js的原型,以下内容为个人理解,如有错误,尽请指正。...首先,明确一点:js中的对象分为普通对象和函数对象,一般我们自定义的可以被new的函数称作函数对象,另外js内置了譬如:Array、Date、Object、Function、Number、String、...__proto__属性,该属性指向其构造的原型,使用__proto__将所有对象联系起来,才形成了所谓的原型链,举个栗子: function Person() {} const p1 = new Person...__proto__ === null) // true, Object的原型是由null"产生"的,null处于原型链顶端 这个从根本上印证了道德经那句:道(null)生一,一生二,二生三,三生万物...__proto__ === p.constructor.prototype) // true 下一节的话讲下js中的继承~

    2.2K30

    js原型链

    ) //true 5.构造函数与它的原型对象有一个相互引用的关系 6.原型对象上添加的方法用于实例对象上使用 隐式原型 每一个实例对象都有一个__proto__属性,称之为隐式原型 对象的隐式原型的值为其对应构造函数的显示原型的值...__proto__) Fn.prototype.test = function(){ console.log('test') } fn.test() 原型链 对象属性的查找规则 原型链本质上是从隐式原型链...当执行 fn.test1()时先对象自身查找发现有,直接调用test1() 当执行fn.test2()时,自身对象上没有test2,接下来看构造函数的原型对象上是否有test2,发现有直接调用test2...当执行fn.toString(),时,自身对象没有,接下来查找它构造函数的原型对象上是否有toString(),发现没有,接下来又继续沿着Fn原型对象的构造函数的原型对象上查找找到toString()...当执行fn.test3()时,查找自身对象没有,它直接的构造函数对象的原型对象上也没有,接下来沿着Fn原型对象的构造函数的原型对象的构造函数的原型对象上查找,这里已经找到原型链的尽头,Object原型对象的

    2.1K20

    JS 原型链

    JS 原型链 1. 原型和原型链的基础结论 1.1 函数与对象的关系 函数是对象,对象都是通过函数创建的。 函数与对象并不是简单的包含与被包含的关系。...1.3 原型和原型链 原型:一个函数可以看成一个类,原型是所有类都有的一个属性,原型的作用就是给这个类的一个对象都添加一个统一的方法。...原型链:每个对象都有一个__proto__,它指向它的prototype原型对象;它的prototype原型对象又有一个__proto__指向它的prototype原型对象,就这样层层向上直到最终找到顶级对象...基于原型链的继承 JavaScript 对象有一个指向一个原型对象的链。...当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。

    2.3K30

    彻底理解js的原型

    什么是原型?原型(prototype)是函数创建的时候默认自带的。只要创建函数,他就默认存在。要理解原型,还要知道,我们所有对象最终都是都是继承自Object的。...通过构造函数创建的对象也有一个原型(__proto__),即构造函数的原型(这里指Person.prototype)指针。简单的说就是person1只有__proto__,没有prototype。...通过new 创建的对象和构造函数是没有关系的,跟构造函数的原型有关系,即person1....理解原型链:首先,我们要知道原型链有什么作用,它的作用就是共享属性和方法。当一个对象访问属性或方法时,首先会在自身上寻找,找不到就会往对象原型上寻找,层层往上寻找的过程就是我们所说的原型链。...如图name是构造函数Person的定义的属性,age是对person1定义的,sex则是构造函数原型定义的。

    7810

    js原型入门

    前言 本文主要是根据《head first javascript程序设计》摘抄学习而成,学习采用这本书主要是一位阿里大佬的建议,经过近期的学习阅读,发现确实比其他的js书籍能更好的理解和使用js的相关知识...之所以出现这样的问题,是因为我们没有充分利用好js的对象模型,其是基于原型的概念的。 原型是什么 js可以从其他对象那里继承属性和行为,更具体的说js使用原型继承。其中其行为继承的对象称为原型对象。...这个是指,会继承原型对象的属性(包括属性方法),同时在新对象中添加属性。 那么如果我们要定义一个小狗的原型,其对象图是什么样的呢?...重写原型 那如果有些时候,我们需要重写bark方法,而不用原型中的方法呢?...this是指向原型对象的,同样我们也很好理解在没有原型的时候,this调用指向的是对象本身,但是你在调用原型原型的方法时你可能认为this指向的是原型对象,其实并非如此。

    1.5K11

    说说JS中的原型对象和原型链

    理解原型对象(有些文章简称为原型)和原型链,是理解JS的重要一环。下面是笔者对JS中原型的理解, 函数对象 俗话说,JS中万物皆对象。函数也是一个对象,只不过函数是在特定环境中执行代码的对象。...每声明一个函数,此函数在JS执行解释时都会被当作一个对象来维护,这就是函数对象。...JS中声明函数的方式有: function fn1(){} var fn2 = function(){} var fn3 = new Function() 所以可以理解为fn1、fn2、fn3都是函数对象...JS中还包括一些系统内置的函数对象,比如: Function Object Array String Number RegExp 函数对象之外的对象都是普通对象。...理解原型对象(其实就一普通对象) 1、只有函数对象才拥有原型对象 也即无论什么时候以什么方式创建一个函数(函数对象),都会根据特定的规则为该函数创建一个prototype属性(原型对象的地址的引用),这个属性就是指向该函数的原型对象

    9210

    彻底弄懂JS原型与原型链

    当访问一个对象的属性时,先在对象的本身找,找不到就去对象的原型上找,如果还是找不到,就去对象的原型(原型也是对象,也有它自己的原型)的原型上找,如此继续,直到找到为止,或者查找到最顶层的原型对象中也没有找到...OK,总结一下:原型存在的意义就是组成原型链:引用类型皆对象,每个对象都有原型,原型也是对象,也有它自己的原型,一层一层,组成原型链。...目前我们现在可以理解为:所有对象都是由new操作符后跟函数调用来创建的,字面量表示法只是语法糖(即本质也是new,功能不变,使用更简洁)。...五、原型链顶层原型链之所以叫原型链,而不叫原型环,说明它是有始有终的,那么原型链的顶层是什么呢?拿我们的person对象来看,它的原型对象,很简单// 1. person的原型对象person....在上面内容的基础之上,我们来模拟一下js引擎读取对象属性:function getProperty(obj, propName) { // 在对象本身查找 if (obj.hasOwnProperty

    1.1K40

    彻底搞懂JS原型与原型链

    说到JavaScript的原型和原型链,相关文章已有不少,但是大都晦涩难懂。本文将换一个角度出发,先理解原型和原型链是什么,有什么作用,再去分析那些令人头疼的关系。...当访问一个对象的属性时,先在对象的本身找,找不到就去对象的原型上找,如果还是找不到,就去对象的原型(原型也是对象,也有它自己的原型)的原型上找,如此继续,直到找到为止,或者查找到最顶层的原型对象中也没有找到...OK,总结一下:原型存在的意义就是组成原型链:引用类型皆对象,每个对象都有原型,原型也是对象,也有它自己的原型,一层一层,组成原型链。...目前我们现在可以理解为:所有对象都是由new操作符后跟函数调用来创建的,字面量表示法只是语法糖(即本质也是new,功能不变,使用更简洁)。...在上面内容的基础之上,我们来模拟一下js引擎读取对象属性:function getProperty(obj, propName) { // 在对象本身查找 if (obj.hasOwnProperty

    2.4K30
    领券