javascript原型——

xiaoxiao2021-03-01  12

原型,原型对象,__proto__,prototype这些概念,好烧脑,不过且看慢慢来

原型原型链,原型对象研究

首先,正规的,我们创建个构造函数看看

打印看看:

person是一个对象,这个对象中只有一个属性,就是__proto__。由此可以知道,构造函数创建对象,会直接给实例加一个__proto__属性。这个属性里面有两个属性,constructor指向构造函数,看到了吧。__proto__里还有一个__proto__。这是怎么来的呢?其实再ECMAScript第5版中,管这个指针叫[[Prototype]],只是没有标准访问,所以在Firefox、Safari和chrome都支持这个__proto__属性

明确一下:我们的每个函数都有一个prototype属性,这个呢就是我们说的原型,这个属性就是一个指针,指向一个对象,这个对象就是原型对象,这个对象是干嘛使呢,就是包含共享的属性和方法,就比如上面的Person。他想要他的子子孙孙都有某个特性,就可以在原型上创建。

prototype是函数特有的属性!!!

我们来看看,在原型上添加属性和方法:

结果:

由上诉现象我们可以知道两个点: 1、原型创建的属性和方法,对于其构造函数创建的新对象,具有相同的属性和方法,共享。2、不管创建实例的先后,原型上的属性和方法都会反映在上面,就像上面的person实在原型添加属性和方法之前创建,但是仍然具有共享的属性和方法。

找共同点了找共同点了,竟然一模一样,那来判断一下。

发现了奥秘所在了没有,实例对象里面有个属性__proto__就是保存的和构造函数的prototype对象一样的对象指针。就是指向同一个对象。这句话严格,不是长得一样就是一个对象了,我们来验证一下:

一个赋值操作,完全反应了再了原型上,所以,他们都指向的是一个共同对象。that's all

这个图也很好的说明了上诉的结论,而且还有一点就是。Person 的原型中,constructor属性就指向Person。

辨别原型:

alert(Person.prototype.isPrototypeOf(person1)); //true alert(Person.prototype.isPrototypeOf(person)); //true

Object.getPrototypeOf()返回对象的原型,IE9+

使用hasOwnProperty()方法来检测一个属性是否存在于实例中,而不是原型中。

 

扩展一下:

对于Object,肯定也是一个构造函数,既然是构造函数,那么就有原型

也就是说,Object.prototype也就是原型链的终点了。

好不好奇Function这个神奇的东西:

1、首先函数作为一个对象,肯定有__proto__属性,Object、Array等都一样,原型都是Function.prototype

2、函数作为函数,有独特的prototype属性,对应于'function () {}'对象

3、Function.__proto__ === Function.prototype === Object.__proto__

4、Function原型的__proto__属性就是'Object {}'

原型链就是这样一层一层链接起来,对象有原型,对象的原型又有原型,一直向上。

总结:

1、只有函数有特有属性prototype,一个函数使用new关键字,那就是构造函数。

2、对象实例__proto__保存的是和构造函数prototype同样的对象。

 

转载请注明原文地址: https://www.6miu.com/read-3200305.html

最新回复(0)