【javascript】 object.__proto__ 菜鸟学习笔记

本文详细解析JavaScript中__proto__属性的使用,展示如何通过__proto__实现对象之间的继承,探讨其在多重继承中的局限性,并进一步讨论如何利用__proto__为原生对象添加方法,以及可能遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

object

必需。 要对其设置原型的对象。

__proto__ 属性可用于设置对象的原型。

该对象或函数继承新原型的所有方法和属性,以及新原型的原型链中的所有方法和属性。 对象可以仅有一个原型(不包括原型链中继承的原型),因此当您调用 __proto__属性时,将替换以前的原型。

简单的来说可以使用__proto__来实现对象之间的继承 上代码

        var a  ={ name:"tom" };
	var b  ={age:12};
	
	//重头戏
	a.__proto__=b;
	console.log(a.name);//tom
	console.log(a.age);//12

但是不能实现多重继承 上代码

	var a  ={ name:"tom" };
	var b  ={age:12};
	var c ={ like:"sing"}
	
	//重头戏
	a.__proto__=b;
	a.__proto__=c;
	console.log(a.name);//tom
	console.log(a.age);//undefind
	console.log(a.like);//12

这样b就被c代替了 于是乎我们也可以给js的原生对象添加方法?

        var a  ={ age:"tom" };
	String.__proto__ = a;
	var s1 = "tt";
	var s2 = new String("tt"); 
	var s3 = String("tt"); 
	
	console.log(String.age); //tom
	console.log(s1.age);//undefind
	console.log(s2.age);//undefind
	console.log(s3.age);//undefind
	
	s1.__proto__ = a ;
	s2.__proto__ = a ;
	s3.__proto__ = a ;
	
	console.log(s1.age);//undefind
	console.log(s2.age);//tom
	console.log(s3.age);//undefind

然后就出现了问题 这就牵涉大别的知识了 日后研究




### 关于 `b.__proto__ === Object.prototype` 的解析 在 JavaScript 中,判断某个对象的原型链是否指向特定的对象,可以通过检查该对象的 `__proto__` 属性来实现。以下是具体分析: #### 对象 `b` 的原型链结构 如果对象 `b` 是通过字面量 `{}` 创建的,则它的原型链遵循如下规则: - 字面量创建的对象默认继承自 `Object.prototype`。 - 这种情况下,`b.__proto__ === Object.prototype` 成立。 对于其他方式创建的对象(例如通过构造函数),则需进一步确认其具体的原型链关系。假设对象 `b` 是由以下代码定义的: ```javascript const b = {}; console.log(b.__proto__ === Object.prototype); // true ``` 上述代码片段表明,当对象 `b` 使用字面量形式创建时,其内部属性 `[[Prototype]]` 被设置为 `Object.prototype`[^1]。 #### 原型链的核心概念 JavaScript 中的原型链涉及两个重要属性:`prototype` 和 `__proto__`。 - **`prototype`**: 函数的一个特殊属性,默认指向一个新对象实例,这个对象用于存储可被共享的方法和属性。 - **`__proto__`**: 每个实例对象都具有的隐式属性,指向创建该实例的构造函数的 `prototype` 属性所指代的对象。 根据引用中的描述,可以得出以下结论: - 如果对象 `b` 是直接从 `Object` 构造器派生而来或者使用字面量 `{}` 定义,则满足 `b.__proto__ === Object.prototype`[^2]。 - 若对象 `b` 继承自另一个构造函数而非 `Object`,那么此表达式的值可能不成立。 #### 特殊情况说明 需要注意的是,在某些极端条件下可能会观察到异常行为。比如尝试获取 `Object.prototype.__proto__` 时,按照 ECMAScript 规范的规定,由于 `Object.prototype` 并未真正拥有自己的 `[[Prototype]]` 属性,因此最终返回的结果应为 `null`。然而实际运行过程中可能出现偏差,这取决于不同引擎的具体实现细节[^3]。 另外还提到一条有趣的链条展示: ```plaintext fn() -> Function.prototype -> Object.prototype -> null ``` 这里体现了标准环境下完整的函数类型及其关联对象之间的层次关系[^4]。 综上所述,只要确保对象 `b` 正常基于基础对象模型构建而成而无额外定制化操作干扰的话,通常能够断定 `b.__proto__ === Object.prototype` 结果有效。 ```javascript // 示例验证代码 function CustomConstructor() {} CustomConstructor.prototype = {}; const objFromLiteral = {}; // 文字表示法生成的标准空对象 const objViaNew = new CustomConstructor(); console.log(objFromLiteral.__proto__ === Object.prototype); // 输出:true console.log(objViaNew.__proto__ === Object.prototype); // 取决于重新赋给 prototype 的具体内容,此处false ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值