Javascript 原型和原型之间的区别

Javascript 原型和原型之间的区别,javascript,Javascript,我试图澄清原型和原型的区别。\uuuu proto\uuuu是否始终指向父级的原型 因此,Array.prototype将包括像concat()这样的方法。 和Array.\uuuuu proto\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 但是,它是一个访问器属性,它公开了访问它的内部对象 但是,如果您阅读了MDN的以下

我试图澄清
原型
原型
的区别。
\uuuu proto\uuuu
是否始终指向父级的
原型

因此,
Array.prototype
将包括像
concat()
这样的方法。 和
Array.\uuuuu proto\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

但是,它是一个访问器属性,它公开了访问它的内部对象

但是,如果您阅读了MDN的以下文本,那么它会告诉您它是如何实现的以及为什么实现的,尽管它从未打算添加

长话短说,虽然它是一个getter/setter,不直接连接到对象,但在几乎任何情况下,都不要使用它
\uuuuu proto\uuuu
是一种传统功能,通常应避免使用

什么是
\uuuuuuuuuuuuuuu
简单地说,
\uuuuuuuuuuuuuuuuuuuuuuuuuu
只是一个属性键。这就是你应该看到的所有东西,因为虽然大多数内置对象都有一个共同的行为,但它决不是必须(甚至应该)以任何特定的方式表现的东西

将其视为常规的getter/setter对 我们可以很容易地使任何键以与
\uuuu proto\uuu
相同的方式工作:

const provingAPoint={
获取ThisisNormalKey(){return Reflect.getPrototypeOf(this)},
set thisisanormkey(proto){Reflect.setPrototypeOf(this,proto)}
}
基本上,这就是
\uuuuu proto\uuuuu
真正的意义所在

始终希望对象不同于默认的
\uuuuuuuuuuuuu
行为 如果您从某个API接收对象,则不应期望
\uuuuu proto\uuuu
的行为与默认对象中的行为相同。看看上面的例子,它变得更清楚,这不是一个可靠的事情。例如,我们可以这样做:

Reflect.defineProperty(提供点,'.'uu proto'{
get:()=>{throw new Error('你没有像这样得到我的原型')},
set:()=>{throw new Error('您不会像这样设置我的原型')}
})
现在,如果有人试图访问此属性,他们将得到一个错误。它现在也是只读的,不能更改或删除

改用正确的方法 全局对象
Object
Reflect
都有静态方法
getPrototypeOf
setPrototypeOf
(不详细介绍
Reflect
及其区别)。如果要操纵原型链,请使用这些

在当今的Java/EcmaScript中,
\uuuuuu proto\uuuuu
的唯一有效用法 令人惊讶的是,有一个有效的用法并不广为人知。创建对象文字时,如果在其上定义
\uuuu proto\uuuu
属性,如果其值为对象或null,则生成的对象将使用该值作为其原型

//这可以省去“Object.create(null,{…descriptors})”的麻烦`
const objectWithNullPrototype={
__proto_uu;:null,
propA:“valueA”,
prop0:“值0”
}
Object.getPrototypeOf(objectWithNullPrototype)/=>`null`
//同样,不要删除任何一致的“proto”行为,因为:
objectWithNullPrototype.\uuuu proto\uuuu/=>`未定义`
关于
prototype
函数的
prototype
属性定义了构造对象时继承的内容

简言之 构造函数
prototype
属性等于它构造的对象的原型。例如:

Object.getPrototypeOf(新数组(12))===Array.prototype/=>true
//注意:不要这样做,请使用文字或'Object.create'`
Object.getPrototypeOf(新对象())===Object.prototype/=>true
Object.getPrototypeOf(new Map())===Map.prototype/=>true
Java/EcmaScript是一种基于原型的语言
如果您对这意味着什么有任何疑问,我强烈推荐您使用google并阅读一些关于它的文章,因为对其含义的误解(或不知道)是错误和困惑的一个非常常见的来源。

最好的做法是完全停止对
\uuuuu proto\uuu
的疑惑,因为这是一个不推荐使用的功能。改用
Object.getPrototypeOf()
。不清楚你所说的“家长”是什么意思,所以我会冒险说不。@Liam走错了路
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。