欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

javascript原型——__proto_和prototype

程序员文章站 2024-03-13 10:52:45
...

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

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

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

javascript原型——__proto_和prototype

打印看看:

javascript原型——__proto_和prototype

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

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

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

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

javascript原型——__proto_和prototype

结果:

javascript原型——__proto_和prototype

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

javascript原型——__proto_和prototype

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

javascript原型——__proto_和prototype

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

javascript原型——__proto_和prototype

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

javascript原型——__proto_和prototype

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

辨别原型:

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

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

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

 

扩展一下:

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

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

javascript原型——__proto_和prototype

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

javascript原型——__proto_和prototype

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

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

3、Function.__proto__ === Function.prototype

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

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

 

总结:

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

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