学习笔记之原型模式 prototype

自定义一个空对象

Person = function(){
}

使用prototype给Person设置公共的值

Person.prototype.name = "zhangsan";
Person.prototype.age = 22;
Person.prototype.say = function(){
                         alert("hello");
                       }

创建两个person实例

var person1 = new Person();
alert(person1.name); //zhangsan
var person2 = new Person();
alert(person2.name); //zhangsan

上面两个实例的name属性值都是zhangsan,而zhangsan是在peototype中设置的,比如当一个实例的name属性发生更改时,并不会去覆盖prototype中的属性,然后如果访问的属性是一个引用类型,并修改其中的值,那将导致所有实例访问该属性得到的都是修改后的值

person1.name = "yida";
alert(person1.name); //yida --来自实例的属性
alert(person2.name); //zhangsan --来自原型的属性

在把person1实例的name属性删除的话,属性又会重新变回prototype的name值

delete person1.name; //删除实例属性
alert(person1.name); //zhangsan --来自原型的属性

可以使用Object的方法HasOwnProperty可以查看返回属性是来自实例中 还是来自原型 。来自实例返回true

alert(person1.hasOwnProperty("name"));

in 单独使用时  只要给定属性在实例或原型中存在,都返回true

alert("name" in person1); //true
alert("names" in person1); //false

在使用for - in 循环时,返回的是所有能通过对象访问的,可枚举的属性。包括实例和原型。

for(var p in person1){
	if(p == "sayHi"){
		alert("found sayHi");
	}
}

取得对象上所有可枚举的实例属性,可以用Object.keys()方法,该方法返回一个包含所有可以枚举属性的字符串数组

var keys = Object.keys(Person.prototype);
alert(keys);//name,age,sayHi

 取的对象上所有实例属性,无论是否可以枚举

alert(Object.getOwnPropertyNames(Person.prototype));//constructor,name,age,sayHi


原型最好与构造函数组合使用,将公用的并值相同的属性定义在原型中,而公用值不相等的属性定义在构造函数,类似继承的样子。具体怎么用有待学习。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值