- 首先说下最容易混淆的prototype和
__proto__
- prototype是函数才会有的属性,用prototype属性(好处:修改「父类」的 prototype 可以动态修改所有已经创造的实例)
-
__proto__
是每个对象都有的属性,__proto__
来自你构造函数的prototype
//在JavaScript的世界中,所有的函数都能作为构造函数,构造出一个对象
//下面我给自己构造一个女神做对象
function NvShen () {
this.name = "Alice";
}
//现在我设置NvShen这个函数的prototype属性
//一般来说直接用匿名的对象就行,我这里是为了方便理解,
//先定义一个hand对象再把hand赋值给NvShen的prototype
var hand = {
whichOne: "right hand",
someFunction: function(){
console.log("not safe for work.");
}
};
NvShen.prototype = hand;
//这个时候,我们可以用NvShen作为构造函数,构造出myObject对象
var myObject = new NvShen();
console.log(myObject.__proto__ === NvShen.prototype) //true
//以上代码部分转自知乎
//作者:刘狗蛋
//链接:https://www.zhihu.com/question/34183746/answer/124279182
普通对象不能通过prototype在原型上设置属性,因为prototype是函数对象才用的属性
顺便替下getPrototypeOf()
的作用,用来查询构造函数的prototype.
var a=function(){}
->undefined
a.prototype.age=24
->24
var b=new a()
->undefined
Object.getPrototypeOf(b)
->Object {age: 24}
2017.2.26新增
isPrototypeOf()
的作用,用于检查调用的对象的原型链里是否存在传入的对象
var a=function(){}
->undefined
var b=new a();
->undefined
a.prototype.isPrototypeOf(b)
->true
instanceof()
的作用,用于检查调用的对象是否是某个构造函数(类型,后面的参数)的实例
var a=function(){}
->undefined
var b=new a();
->undefined
b instanceof a
->true
原型链
网友评论