[Javascript] Prototype 原型
来源:互联网 发布:python关键字怎么看 编辑:程序博客网 时间:2024/06/04 23:24
(1) Concept
原型是为了解决让对象实例都可以共享属性和方法
每个函数都有prototype, 指向一个对象, 对象包含可以共享的属性和方法
<script type="text/javascript"> function People(name,age){ this.name=name; this.age=age; } People.prototype={ say:function(){ return this.name+":"+this.age; } } /* 相同 People.prototype.say=function(){ return this.name+":"+this.age; } */ var jessica=new People("jessica",18); var krystal=new People("krystal",20); console.log(jessica.say()); console.log(krystal.say());</script>
(2) hasOwnProperty(“attr”)
检测实例中是否有属性, 只在实例中返回true
<script type="text/javascript"> function People(username,age){ this.username=username; this.age=age; } People.prototype.username=this.username; var jessica=new People("jessica",18); var krystal=new People("krystal",20); //检测在实例中是否有username这个属性 console.log(krystal.hasOwnProperty("username"));//true</script>
<script type="text/javascript"> function People(username,age){ //实例中没有username这个属性 this.age=age; } People.prototype.username=this.username; var jessica=new People("jessica",18); var krystal=new People("krystal",20); //检测在实例中是否有username这个属性 console.log(krystal.hasOwnProperty("username")); //false </script>
(3) “attr”in obj
检测实例中或者原型是否有属性 通过对象访问属性, 才可以返回true
if username在实例中或者在原型中有的话console.log("username" in jessica);//true
(4) 优点 缺点
优点:
解决构造函数共享的概念
缺点:
共享也是一个问题, 当prototype中有引用类型值
<script type="text/javascript"> function People(username,age){ this.username=username; this.age=age; } People.prototype={ school: "HKBU", friend: ["YoonA","Victoria"]//引用类型 } var jessica=new People("jessica",18); var krystal=new People("krystal",20); //本来jessica想不一样push一个值,结果覆盖了krystal的 jessica.friend.push("seoyon"); console.log(jessica.friend); console.log(krystal.friend); // 基本类型,不会被覆盖 jessica.school="CambridgeU"; console.log(jessica.school); console.log(krystal.school);</script>
Result:
这种情况下,jessica想与krystal不一样, 但是结果却是一样的, 因为在Prototype中引用类型的共享问题。 而基本类型则不会被覆盖。
解决缺点:
为了解决引用类型共享的问题。 使用构造函数+Prototype的结合
(5) 构造函数+ Prototype 结合
<script type="text/javascript"> function People(username,age){ this.username=username; this.age=age; /*不是放到了prototype, 而是放到了实例中*/ this.friend=["YoonA","Victoria"];//引用类型 /*不是放到了prototype, 而是放到了实例中*/ } People.prototype={ school: "HKBU" } var jessica=new People("jessica",18); var krystal=new People("krystal",20); jessica.friend.push("seoyon"); console.log(jessica.friend); console.log(krystal.friend); jessica.school="CambridgeU"; console.log(jessica.school); console.log(krystal.school);</script>
Result:
0 0
- javascript prototype 原型链
- 悟透JavaScript原型prototype
- Javascript prototype 原型链
- javascript prototype原型
- 理解JavaScript原型prototype
- javascript原型prototype
- Javascript---原型prototype
- JavaScript中的原型prototype
- JavaScript:prototype原型
- [Javascript] Prototype 原型
- javascript原型prototype
- javascript prototype原型继承
- javascript原型(prototype)理解
- Javascript原型(Prototype)
- javascript prototype原型类
- JavaScript原型prototype
- JavaScript的prototype(原型)
- JavaScript原型对象prototype
- Android-Media and Camera
- 1.puppet学习笔记:puppet搭建
- 一种计算大数阶乘的算法
- 搜索引擎优化指南教程
- CentOS下编译安装gcc 4.9.0
- [Javascript] Prototype 原型
- Ksoap封装代码
- MPAndroidChart的K线图上添加均线
- 可扩展机器学习——Spark分布式处理
- CSRF与Cookie
- 充电五分钟通话两小时 VOOC闪充助OPPO
- Android ListView中嵌入其实组件后如checkbox,button后ItemClick事件失效的问题
- 欢迎使用CSDN-markdown编辑器
- JAVA__大作业_4_3X题目用户图形界面实现