Javascript:prototype 和 __proto__ 的区别和联系

(1)prototype 是函数( function ) 的一个属性, 它指向函数的原型。

(2)__proto__ 是对象的内部属性, 它指向构造器的原型, 对象依赖它进行原型链查询,instanceof 也是依赖它来判断是否继承关系。

由上, prototype 只有函数才有, 其他(非函数)对象不具有该属性. 而 __proto__ 是对象的内部属性, 任何对象都拥有该属性.

prototype(显式原型)

Javascript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,我们称之为 原型对象 。原型对象的所有属性和方法,都会被构造函数的实例继承。这意味着,我们可以把那些不变的属性和方法,直接定义在 原型对象 上。

注意:通过 Function.prototype.bind 方法构造出来的函数是个例外,它没有 prototype 属性。

作用:用来 实现基于原型的继承属性的共享

1
2
3
4
5
6
7
8
9
function Cat(name, color){
this.name = name;
this.color = color;
}
Cat.prototype.type = "猫科动物";
Cat.prototype.eat = function(){
alert("吃老鼠")
};

__proto__(隐式原型)

JavaScript 中任意对象都有一个内置属性 __proto__ ,在 ES5 之前没有标准的方法访问这个内置属性,但是大多数浏览器都支持通过 __proto__ 来访问。ES5中有了对于这个内置属性标准的 Get 方法即 getPrototypeOf() 。

注意:Object.prototype 这个对象是个例外,它的 __proto__ 值为 null 。

作用:构成原型链,同样用于 实现基于原型的继承 。举个例子,当我们访问 obj 这个对象中的 x 属性时,如果在 obj 中找不到,那么就会沿着 __proto__ 依次查找。

两者之间的关系

(1)对象有属性 __proto__ ,指向该对象的构造函数的原型对象。
(2)构造函数除了有属性 __proto__ ,还有属性 prototype ,prototype 指向该构造函数的原型对象。

1
2
3
4
5
6
7
function Cat(name, color){
this.name = name;
this.color = color;
}
var cat = new Cat("Jetty", "red");
console.log(cat.__proto__ == Cat.prototype); // true
坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章