JS对象的自有属性和原型属性

对于一个对象,我们可以直接在它上面定义属性,也可以让它继承其他对象的属性。

直接定义在对象上的属性被称为对象的自有属性,例如:

上面的例子中,我们创建了own对象,并给它定义了"name""age""like""action"四条属性,这四条属性都是直接定义在own对象上,因此它们都属于own的自有属性。

可以使用console.log()方法输出对象,直观地查看对象中的自有属性。

也可以使用own对象的hasOwnProperty()方法来判断某个属性是不是该对象的自有属性,如果是自有属性返回true,不是自有属性返回false

那么问题就来了:我们明明没有给own对象定义hasOwnProperty属性,这个属性从哪来呢?

答案是:继承自own对象的原型对象

默认情况下,新创建的对象都会有一个默认的原型对象,新对象会从这个默认的原型对象中继承一些常用的方法(对象中的函数通常也被称为方法);可以用Object.prototype引用这个默认的原型对象。

在本例中,own对象的hasOwnProperty()方法就是从它的原型对象继承来的,这个继承来的hasOwnProperty属性被称为own对象的原型属性

我们可以使用console.log()输出own对象,然后展开输出结果,去查看这个对象的原型链(原型链展示了对象的继承关系,可以查看当前对象原型链上的所有原型对象,以及从这些原型对象上继承的所有原型属性)。

参考下面的例子:

上面这个例子可以看出:own对象有一个默认的原型对象,own对象从这个默认原型对象继承了constructor()hasOwnProperty()isPrototypeOf()等方法。

再说一遍!默认情况下,所有新创建的对象都会有这个默认原型对象(除非在创建对象时指定对象的原型对象为空)。

如果我们想在创建对象时手工指定它的原型对象,可以使用Object.create()方法,传入需要作为这个新对象原型的对象。

例如在下面这个例子中:我们先创建了对象objOne,它有两个自有属性"a""b",并且从默认原型对象中继承属性;然后我们用Object.create()方法创建了一个空对象objTwo,并指定这个空对象的原型对象为objOne,然后又给objTwo添加了一条自有属性"c"

最后的结果是:objTwo对象有一条自有属性"c"objTwo对象的原型链上一共有两个原型对象,分别是objTwo的原型对象objOne,和objOne的原型对象(默认原型对象);objTwo对象直接继承了objOne对象的属性"a""b",并间接继承了objOne对象的原型对象上的属性,不管是直接继承的还是间接继承的,这些继承来的属性都统称为objTwo对象的原型属性。

当我们想创建一个没有任何原型对象的空对象时,可以向Object.create()方法传入null,比如下面这个obj对象:

这样一来,我们创建的obj对象就没有任何原型对象,自然也就不会从任何对象继承属性,它就只有自有属性了。