JavaScript面向对象编程指南(五) 原型

第5章 原型

5.1 原型属性

        function f(a,b){return a*b;};// length  属性f.length;  //2// constructor 构造属性f.constructor; // function Function() { [native code] }// prototype 属性 初始值是空对象typeof f.prototype; //"object"

5.1.1 利用原型添加方法和属性

        function f1(name,color){// 使用this添加属性this.name=name;this.color=color;this.whatAreYou=function(){return 'I am a'+this.color+''+this.name;};}// 使用prototype属性添加属性和方法f1.prototype.price=100;f1.prototype.rating=3;f1.prototype.getInfo=function (){return 'Rating: '+this.rating+',price: '+this.price;};

5.1.2 使用原型的属性和方法

        function f1(name,color){// 使用this添加属性this.name=name;this.color=color;this.whatAreYou=function(){return 'I am a'+this.color+''+this.name;};}// 使用prototype属性添加属性和方法f1.prototype.price=100;f1.prototype.rating=3;f1.prototype.getInfo=function (){return 'Rating: '+this.rating+',price: '+this.price;};var f2=new f1('webcam','black');f2.color; // "black"f2.getInfo(); //"Rating: 3,price: 100"// 修改prototype属性,由同一构造器创建的所有对象的prototype属性也都会同时发生改变(会影响在修改之前已经创建的对象)f1.prototype.get=function(what){return this[what];}f2.get('price');  // 100

5.1.4 利用自身属性重写原型属性

对象自身属性的优先级高于原型属性

       function F1(name){this.name=name;};F1.prototype.name='Alen';var f2=new F1('XiaoMing');f2.name;  // "XiaoMing"  不是 Alen// 使用hasOwnProperty()判断一个属性是自身属性还是原型属性f2.hasOwnProperty('name');  //true//删除自身属性后,原型属性才会显示delete f2.name; // truef2.name; // "Alen"

5.1.5 isPrototypeOf()方法

isPrototypeOf():当前对象是否为另一个对象的原型

        var person={like:'eat',age:12,sex:'boy'};function F1(name){this.name=name;}F1.prototype=person;var f2=new F1('Alen');// 判断person是否为f2的原型person.isPrototypeOf(f2);  //true//使用getPrototypeOf()获取原型Object.getPrototypeOf(f2)===person; //true

5.1.6 神秘的__proto__链接

5.2 扩展内建对象

 内建对象的构造器函数可以通过其原型来进行扩展。

 1     <script type="text/javascript">
 2       // 示例1:扩展Array的内建函数,用来查询数组中是否存在某个特定的值
 3       Array.prototype.inArray=function(needle){
 4         for (var i = 0; i < this.length; i++) {
 5             if(this[i]===needle){
 6                return true;
 7             }else{
 8                 return false;
 9             }
10         };
11       };
12       var colors=['red','black','blue'];
13       colors.inArray('red');  //true
14       colors.inArray('green'); //false
15     //示例2:反转字符串
16     // 先利用split()将目标字符串转换成数组,然后调用该数组的reverse()方法产生一个反向数组。
// 最后通过join()方法将结果数组转换为字符串
17 String.prototype.reverse=function (){ 18 return Array.prototype.reverse.apply(this.split('')).join(''); 19 }; 20 "bums".reverse(); //smub 21 </script>

5.2.1 关于内建对象的讨论

 如果想通过原型为某个对象添加一个新属性,务必检查一下该属性是否已经存在。

5.2.2 原型陷阱

 注意: 1> 当对原型对象执行完全替换时,可能会触发原型链中某种异常

            2> prototype.constructor 属性不可靠

 1 <script type="text/javascript">
 2         function Dog(){
 3             this.tail=true;
 4         };
 5         var f1=new Dog();
 6         var f2=new Dog();
 7         // 仍可以为Dog()的原型添加属性,添加之前已经存在的对象也可访问新属性
 8         Dog.prototype.say=function(){
 9             return 'worf';
10         };
11         // f1、f2可以访问新方法
12         f1.say();  //"worf"
13         f2.say(); //"worf"
14         // 检查对象的构造器
15         f1.constructor === Dog; // true  正常
16         f2.constructor === Dog;// true  正常
17         Dog.prototype.constructor === Dog; // true
18 
19         // 用自定义新对象完全覆盖掉原有的原型对象
20         Dog.prototype={
21             paws:4,
22             hair:true
23         };
24         // 这样原有对象不能访问新属性,但通过__proto__与原有的原型保持联系
25         f1.paws; //undefined
26         f1.say();  //"worf"
27         typeof f1.__proto__.say; // "function"
28        // 之后创建的对象室友被更新后的prototype对象
29        var f3=new Dog();
30        f3.say(); // f3.say is not a function
31        f3.tail; // true
32        f3.paws; // 4
33        // __proto__指向新的原型对象
34        f3.__proto__.hair; //true
35 
36        // 新对象的constructor属性不在保持正确
37        f3.constructor;// function Object() { [native code] }
38                       // 本应该指向Dog(),现在指向Object
39        f1.constructor; //function Dog(){this.tail=true;}  仍为Dog() 不变
40        Dog.prototype.constructor; // function Object() { [native code] }
41        //重新设置constructor属性 解决
42        Dog.prototype.constructor=Dog;
43        new Dog().constructor === Dog; // true
44     </script>

 

 

 

转载于:https://www.cnblogs.com/zengFyzL/p/7208574.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java communal_平台用英语怎么说

平台通常指高于附近区域的平面;楼房的阳台。也指指计算机硬件或软件的操作环境。而在网络上所说的平台一般是指网站。那么你知道平台用英语怎么说吗?下面来学习一下吧。平台英语说法1&#xff1a;platform平台英语说法2&#xff1a;terrace平台英语说法3&#xff1a;flat roof…

面试题-- 什么是偏向锁

所谓的偏向&#xff0c;就是偏心&#xff0c;即锁会偏向于当前已经占有锁的线程 。 大部分情况是没有竞争的&#xff08;某个同步块大多数情况都不会出现多线程同时竞争锁&#xff09;&#xff0c;所以可以通过偏向来提高性能。即在无竞争时&#xff0c;之前获得锁的线程再次获…

Ping, IPConfig, Format, Netstat, etc. Not Recognized as Commands

Can you use them when you point directly to them..> C:\Windows\System32\ping.exe 127.0.0.1? If so, you probably have a messed up PATH variable.> echo %PATH%Should have "C:\Windows\System32" in it, does it? 以上为google的结果&#xff0c;我…

Collections.min()和Collections.max()的使用

取集合中的最小值 Collections.min(); 取集合中的最大值 Collections.max(); public class TestCollectionMinMax {public static void main(String[] args) {List<Integer> list new ArrayList<>();list.add(3);list.add(7);list.add(9);list.add(1);list.add(…

java date 过时_过时date.toLocaleString()的解决方法

过时date.toLocaleString()的解决方法 Java代码 收藏代码 System.out.println(new java.util.Date()); 输出&#xff1a;Thu Jan 27 14:43:28 CST 2011 Java代码 收藏代码 System.out.println(new java.util.Date().toLocaleString()); 输出&#xff1a;2011-1-27 14:45:…

linux下查看隐藏的文件

在linux下以点开头命名的文件在系统中视为隐藏文件&#xff0c;例如 “.123 ”。用ls、ls -l或者ll是无法查看的。那么如何才能查看linux系统下的隐藏文件呢&#xff1f;下面介绍一下简单的查看方式。1、#在命令行下使用ls -a2、#在XWindow的KDE桌面中在"查看(View)"…

python学习之路(九)

这一节主要讲的是装饰器。装饰器是一个非常好用的&#xff0c;用于装饰已有函数的函数功能。 其优点是不用修改调用方式&#xff0c;还不用修改源代码。 他的思想是&#xff1a;函数既变量&#xff1b;高阶函数&#xff1b;嵌套函数。 现在来尝试写装饰器 有两个函数 各自实现自…

java http请求实现_java工程实现http请求接口

java工程实现http请求接口java工程实现http请求接口1.实现代码package com.home;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.sun.net.httpserver.HttpExchange;import com.sun.net.httpserver.HttpHandler;import com.sun.net.https…

Java集合中removeIf的使用

使用removeIf方法从List中删除元素 在JDK1.8中&#xff0c;Collection以及其子类新加入了removeIf方法&#xff0c;作用是按照一定规则过滤集合中的元素。这里展示removeIf的用法。 需求是过滤掉学生中分数为为18以下的&#xff0c; 一个学生实体类 Data public class Studen…

Java中lombok @Builder注解使用详解

简介 Lombok大家都知道&#xff0c;在使用POJO过程中&#xff0c;它给我们带来了很多便利&#xff0c;省下大量写get、set方法、构造器、equal、toString方法的时间。除此之外&#xff0c;通过Builder注解&#xff0c;lombok还可以方便的实现建造者模式&#xff0c;创建对象 …

鼠标控制

一&#xff09;客户端 using System;using System.Net;using System.Net.Sockets;using System.Text;using System.IO;using System.Threading; namespace 鼠标控制_客户端{ //我们定义一个保存鼠标坐标的结构 public struct MousePosition { private int x; …

java resourcebundle_Java - Properties和ResourceBundle类学习

一、前言在项目的开发过程中&#xff0c;为了统一配置的管理&#xff0c;我们经常需要将一些配置信息根据环境的不同&#xff0c;配置在不同的properties中&#xff0c;然后从里面进行读取。而Properties类作为最基础也是最经常使用的类&#xff0c;通过本文我们来学习一下它的…

Java中Collections.singletonList用法

Collections.singletonList()返回的是不可变的集合&#xff0c;但是这个长度的集合只有1&#xff0c;可以减少内存空间。但是返回的值依然是Collections的内部实现类&#xff0c;同样没有add的方法&#xff0c;调用add&#xff0c;set方法会报错 调用add方法报错 Exception in…

最近找工作的面试经历

来到广州已经一个星期了&#xff0c;招聘会参加了两场&#xff0c;面试了三间公司&#xff0c;但都是通知回去等结果。回想一下这几天的面试经历&#xff0c;感觉自己要学的东西还很多。 <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office&quo…

CF Round410 D. Mike and distribution

D. Mike and distribution 构造法 798D - Mike and distribution In the beginning, its quite easy to notice that the condition " 2(ap1  ...  apk) is greater than the sum of all elements in A " is equivalent to " ap1  ...  apk is greater …

OOAD实践之路——真实案例解析OO理论与实践(二、第一项任务:特性列表)

查看本系列全部文章&#xff1a;《OOA&D实践之路——真实案例解析OO理论与实践》索引贴 第一份说明 当这个项目开始时&#xff0c;我们得到的关于我们要做的系统的唯一说明是一页Word文档&#xff0c;这是一份简单的不能再简单的说明。文档里只有一行字&#xff1a;我…

CSS3常用属性及用法

1.transition: 过渡属性&#xff0c;可以替代flash和javascript的效果 兼容性&#xff1a;Internet Explorer 9 以及更早的版本&#xff0c;不支持 transition 属性。 Chrome 25 以及更早的版本&#xff0c;需要前缀 -webkit-。 Safari 需要前缀 -webkit-。 div { transition: …

ADSL提速 从入门到精通

虽然现在的宽带速率已经很快了&#xff0c;但是大家还是希望在以下方面提升一下应用速度&#xff1a;电影BT下载时、在线影音播放时、FTP文件传送时等。广大网友也因此探寻出不少提升宽带速率的方法&#xff0c;那么&#xff0c;都有哪些简单可行的提速方法呢&#xff1f;它们的…

Swift开发图解入门

《论语卫灵公》有一段经典对白&#xff1a;『子贡问为仁。子曰&#xff1a;工欲善其事&#xff0c;必先利其器。……』。对于一个程序猿来说&#xff0c;好的工具不意味着一定能产生优质的代码。可是好的工具对提升开发效率的作用还是不言而喻的。想要用Swift做iOS开发。唯一可…