JavaScript原型与原型链

一、原型

构造函数新建实例对象

//User就是一个构造函数
function User(name, password) {
     this.name = name;
     this.password = password;
}

var user1 = new User('admin','123456')

Javascript规定,每一个函数都有一个prototype对象属性,里面放置的是共有、公有的属性或者方法,prototype就是调用构造函数所创建的那个实例对象的原型(proto)。注意:只有函数才有prototype属性,对象是没有的。

每个原型都有一个 constructor 属性指向关联的构造函数。

任何对象都有一个原型对象,这个原型对象由对象的内置属性_proto_指向它的构造函数的prototyoe指向的对象。

//只有函数才有prototype属性
console.log(User.prototype);//Object{}
console.log(user1.prototype);//undefined

//每个原型都有一个 constructor 属性指向关联的构造函数
console.log(User===User.prototype.constructor);//true

//对象(user1)的proto属性会指向该对象的原型
console.log(Object.getPrototypeOf(user1) === User.prototype);//true

其中Object.getPrototypeOf(obj)是ES5中用来获取obj对象的原型对象的标准方法,在不支持ES5的环境中,也可以考虑用_proto_来代替。

二、原型链

原型链的核心就是依赖对象的_proto_的指向,当调用一个对象本身不存在的方法时,它会一层一层往上去找,直到找到Object.prototype。Object.prototype是没有_proto_属性的,等于null。

 

 

console.log(Object.getPrototypeOf(user1) === User.prototype)//true
console.log(Object.getPrototypeOf(User.prototype)===Object.prototype)//true
console.log(Object.getPrototypeOf(Object.prototype))//null

User.prototype.showName  = function(){
     console.log("username:"+this.name);
}
Object.prototype.showPassword = function(){
     console.log("password:"+this.password);
}
user1.showName() //username:admin
user1.showPassword()//password:123456

上面这个例子中,user1调用showName()方法时,发现user1没有这两个方法,于是就去User.prototype中找,找到了后就调用User.prototype中的showName()方法。user1调用showPassword中,也是先在自身找,没有之后就沿着原型链指向的对象的构造函数的prototype中找,直到找到了Object.prototype中的showPassword()方法于是调用,若是还没有找到就会返回undefined或者报错。

user1能调用这两个方法就是依赖原型链的机制。

posted @ 2021-08-02 14:15  hwinter_c  阅读(32)  评论(0编辑  收藏  举报