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

js中的原型是什么

在JavaScript中,原型(Prototype)是一种实现对象间继承的机制。每个JavaScript对象都有一个指向其原型的内部链接,这个原型对象定义了该对象继承的方法和属性。当试图访问一个对象的属性时,如果该对象本身没有这个属性,JavaScript会在该对象的原型链上查找,直到找到该属性或者到达原型链的末端(即null)。

基础概念

  • 每个JavaScript函数都有一个prototype属性,这个属性是一个指针,指向一个对象,这个对象包含了可以被所有由该函数创建的实例共享的属性和方法。
  • 当使用构造函数创建一个新对象时,这个新对象会从构造函数的prototype属性所指向的对象上继承属性和方法。
  • 每个对象都有一个内部属性[[Prototype]](在ES6及以后版本中可以通过__proto__属性访问,但推荐使用Object.getPrototypeOf()方法),它指向该对象的原型。

优势

  • 实现了基于原型的继承,允许对象之间共享属性和方法,节省内存。
  • 提供了一种灵活的继承机制,可以在运行时动态地改变对象的原型。

类型

  • 构造函数的原型:通过构造函数创建的对象实例的原型。
  • 对象字面量的原型:通过对象字面量创建的对象的原型,默认指向Object.prototype

应用场景

  • 继承:通过原型链实现对象间的继承。
  • 方法共享:将方法定义在构造函数的原型上,使得所有实例都能共享这些方法,而不是每个实例都创建一个新的方法副本。

遇到的问题及解决方法

  • 原型链污染:当修改了原型对象时,会影响到所有继承自该原型的对象。解决方法是避免直接修改内置对象的原型,或者使用Object.create()来创建一个新对象,作为新的原型。
  • 性能问题:过长的原型链会影响属性访问的性能。解决方法是保持原型链的简洁,避免不必要的继承层次。

示例代码

代码语言:txt
复制
// 构造函数
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// 在构造函数的原型上添加方法
Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
};

// 创建实例
const person1 = new Person('Alice', 30);
const person2 = new Person('Bob', 25);

// 调用原型上的方法
person1.sayHello(); // 输出: Hello, my name is Alice and I am 30 years old.
person2.sayHello(); // 输出: Hello, my name is Bob and I am 25 years old.

// 检查原型
console.log(Object.getPrototypeOf(person1) === Person.prototype); // 输出: true

在这个例子中,Person构造函数的prototype属性被用来添加一个sayHello方法,这个方法会被所有Person的实例继承。当我们创建person1person2实例时,它们都能够调用sayHello方法,尽管这个方法实际上是在它们的原型上定义的。

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

相关·内容

JS中的原型和原型链

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

1.5K10
  • js中的原型和原型链

    ​一、原型 1、prototype和constructor 在js中每个函数(非箭头函数,一般关于原型的有关知识我们都只考虑构造函数)都会拥有一个 prototype 属性,该属性值是一个对象...__proto__) // true 二、原型链 原型链:《JavaScript高级程序设计》中的描述是:每个构造函数都有一个原型对象,如果该原型是另一个类型的实例呢?...原型链中的查找机制:实例对象上找不到指定属性,就从该原型对象上找,如果还是找不到就到该原型对象上的原型上去找,。...虽然一些浏览器仍然支持它,但也许已从相关的 web 标准中移除,也许正准备移除或出于兼容性而保留。请尽量不要使用该特性。 当 Object.prototype....语句上,它还会影响到所有继承来自该 [[Prototype]] 的对象,如果你关心性能,你就不应该在一个对象中修改它的 [[Prototype]]。

    1.1K00

    说说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 函数对象之外的对象都是普通对象。...不说话看图: 由此,可得到下面的关系图: 思考 原型链中的关系图其实还缺少一环,就是内置函数Function。

    9210

    深度剖析前端JavaScript中的原型(JS的对象原型)

    原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链 (prototype chain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法。...注意:必须重申,原型链中的方法和属性没有被复制到其他对象——它们被访问需要通过前面所说的“原型链”的方式。...注意:没有官方的方法用于直接访问一个对象的原型对象——原型链中的“连接”被定义在一个内部属性中,在 JavaScript 语言标准中用 [[prototype]] 表示(参见 ECMAScript)。...__proto__,看看代码中的原型链是什么样的! ---- prototype 属性:继承成员被定义的地方 那么,那些继承的属性和方法在哪儿定义呢?...JavaScript 中到处都是通过原型链继承的例子。比如,你可以尝试从 String、Date、Number 和 Array 全局对象的原型中寻找方法和属性。

    1.1K30

    浅谈与使用js中的原型

    浅谈与使用js中的原型# 1 什么是原型# “ 每个函数都会创建一个 prototype 属性,这个属性是一个对象,包含应该由特定引用类型的实例 共享的属性和方法。...实际上,这个对象就是通过调用构造函数创建的对象的原型。无论何时,只要创建一个函数,就会按照特定的规则为这个函数创建一个 prototype 属性(指向 原型对象)。”...按照我现在的理解就是:每个函数上面都有一个prototype属性,这个就是原型,我们可以通过这个原型属性来完成一些比较厉害的操作。...2 原型的使用# 首先我们使用设计模式中的工厂模式来实现一个Person类,可以通过new这个Person的函数来创建一个与之具有相同属性的实例,也就省的我们再次创建Person函数了。...3 小结# 本文仅是对于原型有个简单的认识也使用,原型在js中是一个比较重要的模块,还有__proto__ 、 原型链 这些概念没有讲到,如果感兴趣,可以再通过书籍及视频来交叉理解。

    1.1K30

    JS中的面向对象、原型、原型链、继承总结大全

    补充: js中说一切都是对象,是不完全的,在js中6种数据类型(Undefined,Null,Number,Boolean,String,Object)中,前五种是基本数据类型,是原始值类型,这些值是在底层实现的...Person.prototype.constructor = Person; 原型模式就是不必在构造函数中定义实例的属性和方法,而是将属性和方法都添加到原型对象中。...都指向了Person.prototype中的showName 这种构造函数模式和原型模式组合使用,基本上可以说是js中面向对象开发的一种默认模式,介绍了以上这几种常用创建对象的方式, 还有其他不常用的模式就不介绍了...属性查找机制 js中实例属性的查找,是按照原型链进行查找,先找实例本身有没有这个属性,如果没有就去查找查找实例的原型对象,也就是[[prototype]]属性指向的原型对象,一直查到Object.prototype...方法继承,就是上文讲的到的原型链机制继承,另外可以给子构造函数添加自己的属性和方法。 这就是经典继承,避免了但是使用构造函数或者单独使用原型链的缺陷,成为js中最常用的继承方式。

    1.4K22

    JS原型与原型链

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

    1.8K50

    js原型和原型链

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

    2.1K10

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

    JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个概念一知半解,碰到问题靠...原因是:People1和People2的原型是People.prototype,答案在下方的:构造函数是什么以及它做了什么。...写操作)、Object.create(target)(生成操作)代替构造函数是什么、它做了什么出自《你不知道的js》:在js中, 实际上并不存在所谓的'构造函数',只有对于函数的'构造调用'。...foo1.obkoro1和foo1.koro:返回undefined静态属性: foo.obkoro1、foo.koro函数在JS中是一等公民,它也是一个对象, 用来模拟类。...原型对象改变,原型链下游获取的值也会改变上面那个例子中的foo1.test的值是什么?

    1.5K20

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

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

    1.6K20

    JS进阶:原型与原型链

    JS进阶:原型与原型链 image.png JavaScript中除了基础数据类型外都是对象(引用类型)。...该原型对象也有一个自己的原型对象( __proto__ ) ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。...这里dog2重写bark方法并没有对dog1造成影响,因为它重写bark方法的操作实际上是为自己添加了一个新的方法使原型中的bark方法被覆盖了,而并非直接修改了原型中的方法。...如果想要统一修改所有实例继承的属性,只需要直接修改原型对象中的属性即可。而且每个实例仍然可以重写原型中已经存在的属性来覆盖这个属性,并且不会影响到其他的实例。...通过原型链就可以在JavaScript中实现继承,JavaScript中的继承相当灵活,有多种继承的实现方法,这里只介绍一种最常用的继承方法也就是组合继承。

    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原型入门

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

    1.5K11

    JS 原型链

    JS 原型链 1. 原型和原型链的基础结论 1.1 函数与对象的关系 函数是对象,对象都是通过函数创建的。 函数与对象并不是简单的包含与被包含的关系。...1.4 JavaScript 里最顶层的两个概念 Function 是最顶层的构造器 Function 是JavaScript 里最顶层的构造器,它构造了系统中的所有对象,包括定义对象、系统内置对象、甚至包括它自己...__proto__ **前提结论:**在JavaScript中,函数都是对象,是对象就有隐藏的__proto__属性 「解释:」 Function是最顶级的构造器,函数对象都是通过它构造的 「结论:」函数...var c = new A(); console.log(b.n); console.log(b.m); console.log(c.n); console.log(c.m); 请写出上面编程的输出结果是什么...= 'value b'; console.log(foo.a); console.log(foo.b); console.log(F.a); console.log(F.b); 请写出上面编程的输出结果是什么

    2.3K30

    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的原型

    什么是原型?原型(prototype)是函数创建的时候默认自带的。只要创建函数,他就默认存在。要理解原型,还要知道,我们所有对象最终都是都是继承自Object的。...通过new 创建的对象和构造函数是没有关系的,跟构造函数的原型有关系,即person1....__proto__ === Person.prototype搞清楚对象、构造函数他们原型的是什么,其他就更好理解了。...我们在理解new创建对象的过程发生了什么,可以加深理解他们的关系:一共5步:(1) 在内存中创建一个新对象。...理解原型链:首先,我们要知道原型链有什么作用,它的作用就是共享属性和方法。当一个对象访问属性或方法时,首先会在自身上寻找,找不到就会往对象原型上寻找,层层往上寻找的过程就是我们所说的原型链。

    7810
    领券