js中的原型到底是什么?

  • 原型的概念
    原型通常指的是prototype__proto__这两个原型对象
    其中前者叫做显式原型对象,后者叫做隐式原型对象
    在js中所有的函数都有一个prototype对象,每一个对象都有__proto__,既然prototype是一个对象,那么他必然也有一个__proto__(在后面会详细解释)
  • __proto__prototype之间的关系
  1. __proto__等于其构造函数的prototype,即每个__proto__都指向其构造函数的prototype
		var obj =new Object();
        console.log(obj.__proto__===Object.prototype);//true
  1. 若在构造函数的prototype上添加方法或者书写,则其下的所有实例对象的__proto__都会添加对应的方法或属性
  2. 所有的方法都是由Function实例化而来的,比如Object,Array,Date等,且包括Function自身,所以Function的__proto__指向自身的prototype
  • 原型链
    原型链是实例对象与原型之间的连接
    若要查找某个对象上的属性或者方法,过程中会先查找自身,再顺着原型链逐级查找,若没找到则返回undefined
		var Fn = function () {};
        var f = new Fn();
        Function.prototype.a = 1;
        Object.prototype.b = 2;
        
        console.log(Fn.a); //1			Fn--->Function--->a=1
        console.log(f.a); //undefined	f--->Object 未找到返回undefined
        console.log(f.b);//2			f--->Object--->b=2

上方代码创建了一个方法Fn和一个以Fn为构造函数的对象f
并为Function和Object的原型上分别添加了一个属性(Function和Object是方法和对象的构造函数)

上面说过所有的__proto__都指向其构造函数的prototype,所以Fn的__proto__会指向Function的prototype,f的__proto__会指向Object的prototype
在这里插入图片描述

  • 练习题
		
		var F = function () {};
        Object.prototype.a = function () {
            console.log('a()');
        }
        Function.prototype.b = function () {
            console.log('b()');
        }
        var f = new F();
        
        //以下哪些函数可以正常运行
        f.a();		//yes		f--->Object--->a
        f.b();		//error		f--->Object--->b(未找到)
        F.a();		//yes		F--->Function--->Object--->a
        F.b();		/yes		F--->Function--->b
### 三级标题:JavaScript 原型原型链概述 在 JavaScript 中,每个对象都有一个内部属性 `[[Prototype]]`,它指向另一个对象,这个对象称为原型。通过原型,对象可以继承属性和方法。JavaScript 的对象模型基于原型继承机制,而不是基于类的继承[^1]。 原型链是由对象的 `[[Prototype]]` 链接形成的一个查找路径。当访问一个对象的属性或方法时,如果该对象本身没有定义这个属性或方法,JavaScript 引擎会沿着原型链向上查找,直到找到相应的属性或方法,或者到达原型链的末端 `null` 为止[^4]。 例如,定义一个构造函数 `Person`,其原型对象 `Person.prototype` 包含共享的方法和属性。每个通过 `new Person()` 创建的实例都会通过内部 `[[Prototype]]` 指向 `Person.prototype`。如果 `Person.prototype` 本身又是另一个对象的原型,那么就形成了一个原型链[^2]。 ```javascript function Person(name) { this.name = name; } Person.prototype.sayHello = function() { console.log(`Hello, my name is ${this.name}`); }; const person1 = new Person("Alice"); person1.sayHello(); // 输出: Hello, my name is Alice ``` 上述代码中,`person1` 实例本身没有 `sayHello` 方法,因此 JavaScript 会查找 `person1.__proto__`,即 `Person.prototype`,并在其中找到该方法[^4]。 ### 三级标题:原型链的结构与查找过程 JavaScript 中的原型链通常以 `Object.prototype` 作为终点,其 `__proto__` 属性为 `null`,表示原型链的结束[^3]。这种链式结构使得对象可以继承多层属性和方法。 例如,当访问 `person1.toString()` 时,JavaScript 首先检查 `person1` 是否有 `toString` 属性,如果没有,则查找 `Person.prototype`,如果仍然没有,则继续查找 `Object.prototype`,最终找到 `toString` 方法并调用[^4]。 原型链的动态性体现在:即使在对象创建之后,也可以修改原型对象,所有引用该原型的对象都会受到影响。例如: ```javascript function Person() {} const personA = new Person(); Person.prototype.greet = function() { console.log("Hi there!"); }; personA.greet(); // 输出: Hi there! ``` 上述代码中,`personA` 在创建之后才添加 `greet` 方法到 `Person.prototype`,但仍然可以成功调用该方法,这体现了原型链的动态特性[^2]。 ### 三级标题:原型链的常见应用场景 原型链广泛用于实现 JavaScript 中的继承。通过 `Object.create()` 方法可以显式创建一个对象,并将其 `[[Prototype]]` 设置为另一个对象: ```javascript const animal = { eat: function() { console.log("Eating..."); } }; const dog = Object.create(animal); dog.bark = function() { console.log("Woof!"); }; dog.eat(); // 输出: Eating... dog.bark(); // 输出: Woof! ``` 在上述代码中,`dog` 对象继承了 `animal` 的 `eat` 方法,体现了原型链在继承中的作用。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值