学习笔记之重写原型

重写原型相对的比较简单

function Person(){}
			
Person.prototype = {
		name : "zhangsan",
		age : 22,
		sayHi : function(){
			alert("hi");
		}
}

当重写原型后,实例的构造器将不在指向原型,而是Object,虽然用instanceof判断没有问题,实例依旧是Person,但constructor则等于Object不等于Person了

var person = new Person();
console.log(person instanceof Object); //true
console.log(person instanceof Person); //true
console.log(person.constructor == Object); //true
console.log(person.constructor == Person); //false

ECMAScript 5 后的javaScript可以通过defineProperty来将constructor设置回Person

Object.defineProperty(Person.prototype,"constructor",{
	enumerable : false,
	value : Person
});
在来测试一下

console.log(person instanceof Object);//true
console.log(person instanceof Person);//true
console.log(person.constructor == Object);//false
console.log(person.constructor == Person);//true

原型的动态性

在原型中查找值是一次搜索,因此对原型对象的任何修改都可以立即从实例上反映出,比如:

function Person(){}
var person1 = new Person();
			
Person.prototype.name = "zhangsan";
Person.prototype.age = 22;
Person.prototype.sayHi = function(){
	alert("hi");
}
				
person1.sayHi(); //hi
上面即使实例的声明在原型之前,依据可以访问sayHi属性,实例与原型是松耦合的关系,但调用sayHi属性时,先会在实例中查询,查询不到会去原型中查询名为sayHi的属性。但如果重写了原型,就不行了,重写了原型,实例必须声明在重写之后才能访问原型属性,否则将抛出异常。

Person.prototype = {
	name : "zhangsan",
	age : 22,
	sayHi : function(){
		alert("hi");
	}
}

person1.sayHi(); //error
var person2 = new Person();
person2.sayHi(); //hi

上面person1抛出了sayHi is not a function而之后声明的实例person2调用sayHi则是正常的弹出一个提示框






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值