对于一个对象,我们可以直接在它上面定义属性,也可以让它继承其他对象的属性。
直接定义在对象上的属性被称为对象的自有属性,例如:

上面的例子中,我们创建了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
对象就没有任何原型对象,自然也就不会从任何对象继承属性,它就只有自有属性了。