JavaScript中prototype的解释

合集下载

prototype的用法

prototype的用法

prototype的用法
1. 设计验证:在产品设计初期,用prototype制作出一个模型,用于验证和测试产品的设计,以确定是否满足需求、功能设计是否合理,并对产品的改进提供参考。

2. 用户测试:在向用户展示产品之前,可以使用prototype模型,让用户参与测试和评估,以获取用户反馈和建议,进一步优化设计和增加用户体验。

3. 营销展示:prototype可以展示功能和设计,用于吸引投资者、客户或其他合作伙伴的注意力,并有效地表达产品的核心价值。

4. 教育培训:prototype可以用于学生的课程设计和教育培训,帮助他们更好地理解和应用相关领域的知识。

5. 制造生产:对于制造生产领域,prototype可以帮助制造商制定产品制造流程和质量控制标准,降低成本和风险。

object.prototype.tostring原理

object.prototype.tostring原理

object.prototype.tostring原理
`Object.prototype.toString` 是 JavaScript 中的一个内置方法,它用于返回一个对象的字符串表示形式。

它的原理如下:
1. 当我们调用一个对象的 `toString` 方法时,JavaScript 引擎首先会检查该对象是否有自己的 `toString` 方法。

如果有,则调用该方法并返回结果。

2. 如果对象没有自己的 `toString` 方法,JavaScript 引擎会继续检查该对象的原型链。

它会向上追溯原型链,直到找到一个具有 `toString` 方法的对象。

3. 一旦找到具有 `toString` 方法的对象,JavaScript 引擎会调用该方法并返回结果。

4. 如果整个原型链上都没有找到一个具有 `toString` 方法的对象,那么 JavaScript 引擎会使用默认的
`Object.prototype.toString` 方法。

该方法会返回一个表示该对象类型的字符串,格式如 `[object 类型]`,其中 `类型` 是对象的类型,比如 `Array`、`Object` 等。

需要注意的是,由于 `Object.prototype.toString` 是一个内置方法,我们不能直接修改它的行为。

然而,我们可以通过修改对象的原型链上的 `toString` 方法来改变某个对象的 `toString` 行为。

javascript高级程序设计

javascript高级程序设计

构成javascript 完整实现的各个部分:>javascript 的核心ECMAScript 描述了该语言的语法和基本对象;描述了该语言的语法和基本对象;>DOM 描述了处理页面内容的方法和接口;描述了处理页面内容的方法和接口;>BOM 描述了与浏览器进行交互的方法和接口;原始值和引用值在ECMAScript 中,变量可以存放两种类型的值,即原始值和引用值。

原始值是存储在栈中的简单数据段,原始值是存储在栈中的简单数据段,也就是说,也就是说,它们的值直接存储在变量访问的位置。

位置。

引用值是存储在堆中的对象,引用值是存储在堆中的对象,也就是说,也就是说,也就是说,存储在变量处的值是一个指针,存储在变量处的值是一个指针,存储在变量处的值是一个指针,指向存指向存储对象的内存处。

储对象的内存处。

为变量赋值时,为变量赋值时,ECMAScript ECMAScript 的解释程序必须判断该值是原始类型的,还是引用类型的。

要实现这一点,解释程序则需尝试判断该值是否为ECMAScript 的原始类型之一。

由于这些原始类型占据的空间是固定的,由于这些原始类型占据的空间是固定的,所以可将它们存储在较小的所以可将它们存储在较小的内存区域内存区域------------栈中。

栈中。

栈中。

ECMAScript 有5种原始类型,即underfined underfined 、、null null、、boolean boolean 、、number number、、stringECMAScript 提供了typeof 运算来判断一个值是否在某种类型的范围内。

注意:对变量或值调用typeof 运算符的时候返回object---object---的变量是一种引用的变量是一种引用类型或null 类型。

类型。

String 类型的独特之处在于,它是唯一没有固定大小的原始类型。

转换成字符串:转换成字符串:ECMAScript 的boolean 值、数字、字符串的原始值得有趣之处在于它们是伪对象,这意味着它们实际上具有属性和方法。

JavaScript常用术语中英文对照表

JavaScript常用术语中英文对照表

JavaScript常用术语中英文对照表push :添加一个数组元素document :文档pop :删除最后一个数组元素console :控制台shift :删除第一个数组元素string :字符串Concat 组合数组undefined :未定义typeof :关键字join:数组转化为指定分隔符slice:返回指定数组length:数组长度Array:数组number:数字boolean:布尔alert:提示框parseInt:转化为整型数值continue:继续is NaN:非数字sort:升序break:截断跳出reverse:倒序object:对象类型parseFloat:转化为浮点值index:索引floor:向下取整variable:变量ceil:向上取整round:四舍五入abs:返回绝对值eval:解析字符串并运算max:比较最大值return:返回min:比较最小值addEventListener:事件名函数to.fixed:保留小数点attachEvant:(on)事件名random:随机数eletment:元素onclick:鼠标单击事件eventName:事件名ondblclick:鼠标双击事件function:函数onselect:内容被选中事件removeEventListener:事件解除onmouseover:鼠标移入事件detachEvent:删除已注册事件onmouseout:鼠标移出事件open():弹出一个新窗口onfocus:获得焦点事件function:函数(方法)showModalDialog:弹出一个模式窗口close():关闭当前窗口onblur:失去焦点事件onkeydown:键盘按下事件(前)Date:日期对象onkeyup:键盘松开事件onkeypress:键盘按下事件(后)getFullYear():年份getMonth():月份(0--11)getDate():几号getDay():星期几(周一至周六)getHours():小时(0--23)getMinites():分钟getSeconds():秒数(0--59)getMilliseconds():毫秒数getTime():从1970至今的毫秒数Date.now():从1970至今的毫秒值tolocaleDatestring():输出本地化的日期setTimeout:延迟时间tolocaleTimestring():输出本地化得时间clearTimeout:定时器对象tolocalestring:输出本地化的日期和时间setInterval:间隔时间clearInterval:停止window.status:浏览器状态栏信息window.screen:屏幕信息screen.width:屏幕宽度screen.height:屏幕高度screen.availwidth:去掉任务栏宽度screen.avaiheight:去掉任务栏高度history:浏览历史记录location:地址栏对象onchange;内容改变事件onkeydown;键盘按下事件(前)onkeyup;键盘松开事件onkeypress;键盘按下事件(后)navigator:用于获取用户浏览器信息appCodeName:浏览器代码名的字符串表示appName:返回浏览器的名称appVersion:返回浏览器的平台和版本信息platform:返回运行浏览器的操作系统平台userAgent:返回由客户机发送服务器的user-agent:头部的值Exception:异常意外情况(try---catch)onload:当页面加载完成之后触发获取元素对象方式:getElementByld:getElementsByName:gatElementsByTagName:getElementByClassName:。

JS变量的定义和数据类型

JS变量的定义和数据类型

JS变量的定义和数据类型JavaScript 输出JavaScript 没有任何打印或者输出的函数。

JavaScript 可以通过不同的⽅式来输出数据:使⽤ window.alert() 弹出警告框。

使⽤ document.write() ⽅法将内容写到 HTML ⽂档中。

使⽤ innerHTML 写⼊到 HTML 元素。

使⽤ console.log() 写⼊到浏览器的控制台。

(⼀)Javascript的变量定义JS脚本编程语⾔中的变量和其他编程语⾔定义变量是不⼀样的,在其他编程语⾔中定义变量的关键字⽤该变量数据类型的关键字,⽐如:int来定义整数数据类型,float定义⼩数,string定义字符串。

⽽,在JS中,所有类型的变量,都⽤var来定义。

定义变量使⽤关键字var,语法如下:var 变量名变量名可以任意取名,但要遵循命名规则:1.变量必须使⽤字母、下划线(_)或者美元符($)开始。

2.然后可以使⽤任意多个英⽂字母、数字、下划线(_)或者美元符($)组成。

3.不能使⽤JavaScript关键词与JavaScript保留字。

JavaScript 变量的⽣存期(变量声明是如果不使⽤ var 关键字,那么它就是⼀个全局变量,即便它在函数内定义。

)JavaScript 变量的⽣命期从它们被声明的时间开始。

局部变量会在函数运⾏以后被删除。

全局变量会在页⾯关闭后被删除。

(⼆)JavaScript的数据类型JavaScript 数据类型字符串(String)、数字(Number)、布尔(Boolean)、数组(Array)、对象(Object)、空(Null)、未定义(Undefined)。

1.字符串(string)(⼀)JavaScript 字符串String 对象⽤于处理已有的字符块。

字符串是存储字符(⽐如 "Bill Gates")的变量。

字符串可以是引号中的任意⽂本。

您可以使⽤单引号或双引号:实例var carname="Volvo XC60";var carname='Volvo XC60';您可以在字符串中使⽤引号,只要不匹配包围字符串的引号即可:也就是说字符串⾥⾯含有单引号,那么我们定义字符串的符号就⽤双引号。

javascript中关于function中的prototype

javascript中关于function中的prototype

javascript中关于function中的prototype 在javascrpit中每个函数中都有⼀个prototype属性,在其创建的时候,⽆论是⽤var method = function(){}或者 var method = new Function()或者function method(){}三种⽅法中哪⼀种⽅法去创建这个变量,其中都会⾃带有prototype属性。

prototype属性是⼀个对象,其中默认会含有constructor属性。

该属性是指向函数本⾝的⼀个指针。

向上⾯定义的method⽅法,如果该⽅法时⼀个构造函数,那个⽤该构造函数创建的新的对象:如 var m = new method();(⼀般构造函数⾸字母为⼤写以⽰区分,这⾥忽略)。

那么该m中有⼀个指向原型的指针[_proto_],这个指针直接是访问不到的,需要通过Object.getPrototypeOf()⽅法去访问,亦或通过m.constructor.prototype去访问。

⽐如在method.prototype中定义⼀个⽅法,method.prototype.sayHello = function(){alert("hello");};。

那么新对象m中也可以直接调⽤这个⽅法。

m.sayHello();这时候会弹出警告框hello。

每个对象中属性查询的顺序是先查找对象本⾝中有没有该属性,如果没有,就会查找该对象的原型,原型的原型,直⾄最顶层的Object或者找到该属性为⽌,如果没找到则会返回undefined。

这⾥就可以理解上⾯通过m.constructor.prototype去访问⾃⼰构造函数prototype的原理了。

m本⾝中是没有constructor这个构造函数指针的,所以会去查找m的[_proto_]所指向的原型中有没有constructor。

有因为m的[_proto_]是指向method.prototype,那么肯定包含constructor指针指向method本⾝,⽽prototype⼜是method中的属性,所以绕⼏个弯以后就可以访问到[_proto_]所指向的原型对象了。

前端面试常见知识点

前端面试常见知识点

前端⾯试常见知识点1、JavaScript this指针、闭包、作⽤域this:指向调⽤上下⽂闭包:内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。

当其中⼀个这样的内部函数在包含它们的外部函数之外被调⽤时,就会形成闭包。

闭包的好处:(1)不增加额外的全局变量,(2)执⾏过程中所有变量都是在匿名函数内部。

闭包的缺点:(1)滥⽤闭包函数会造成内存泄露,因为闭包中引⽤到的包裹函数中定义的变量都永远不会被释放,内存消耗很⼤,所以不能滥⽤闭包,否则会造成⽹页的性能问题,在IE中可能导致内存泄露。

解决⽅法是,在必要的时候,及时释放这个闭包函数,(在退出函数之前,将不使⽤的局部变量全部删除。

)(2)闭包会在⽗函数外部,改变⽗函数内部变量的值。

所以,如果你把⽗函数当作对象(object)使⽤,把闭包当作它的公⽤⽅法(Public Method),把内部变量当作它的私有属性(private value),这时⼀定要⼩⼼,不要随便改变⽗函数内部变量的值。

作⽤域:作⽤域就是变量与函数的可访问范围,即作⽤域控制着变量与函数的可见性和⽣命周期。

在JavaScript中,变量的作⽤域有全局作⽤域和局部作⽤域两种。

全局作⽤域:在代码中任何地⽅都能访问到的对象拥有全局作⽤域(1)最外层函数和在最外层函数外⾯定义的变量拥有全局作⽤域(2)所有末定义直接赋值的变量⾃动声明为拥有全局作⽤域(3)所有window对象的属性拥有全局作⽤域局部作⽤域(Local Scope) :和全局作⽤域相反,局部作⽤域⼀般只在固定的代码⽚段内可访问到,最常见的例如函数内部,所有在⼀些地⽅也会看到有⼈把这种作⽤域称为函数作⽤域,2. Javascript作⽤域链?理解变量和函数的访问范围和⽣命周期,全局作⽤域与局部作⽤域的区别,JavaScript中没有块作⽤域,函数的嵌套形成不同层次的作⽤域,嵌套的层次形成链式形式,通过作⽤域链查找属性的规则需要深⼊理解。

javascript中的constructor

javascript中的constructor

javascript中的constructor1. 使⽤constructorconstructor是Object类型的原型属性,它能够返回当前对象的构造器(类型函数)。

利⽤该属性,可以检测复合类型数据的类型,如对象,数组和函数等。

【⽰例1】下⾯代码可以检测对象和数组的类型,以此可以过滤对象、数组。

var o = {};var a = [];if (o.constructor == Object){console.log("o是对象")}if (a.constructor == Array){console.log("a是数组“)} 结合typeof运算符和constuctor属性,可以检测不同的数据类型。

以下是常见的数据类型检测结果。

值(value)typeof value(表达式返回值)value.constructor(构建函数的属性值)var value =1“number"Numbervar value ="a""string"Stringvar value"boolean"Booleanvar value = {}"object"Objectvar value = new Object()"object"Objectvar value = []"object"Arrayvar value = new Array()"object"Arrayvar value = function90{}"function"Functionfunction className(){};"object"classNamevar value = new className();。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JavaScript prototype 的深度探索J avaScript 中对象的prototype 属性,可以返回对象类型原型的引用。

这是一个相当拗口的解释,要理解它,先要正确理解对象类型(Type)以及原型(prototype)的概念。

1、什么是prototypeJavaScript 中对象的prototype 属性,可以返回对象类型原型的引用。

这是一个相当拗口的解释,要理解它,先要正确理解对象类型(Type)以及原型(prototype)的概念。

前面我们说,对象的类(Class)和对象实例(Instance)之间是一种“创建”关系,因此我们把“类”看作是对象特征的模型化,而对象看作是类特征的具体化,或者说,类(Class)是对象的一个类型(Type)。

例如,在前面的例子中,p1 和p2 的类型都是Point,在JavaScript 中,通过instanceof 运算符可以验证这一点:p1 instanceof Pointp2 instanceof Point但是,Point 不是p1 和p2 的唯一类型,因为p1 和p2 都是对象,所以Obejct 也是它们的类型,因为Object 是比Point 更加泛化的类,所以我们说,Obejct 和Point 之间有一种衍生关系,在后面我们会知道,这种关系被叫做“继承”,它也是对象之间泛化关系的一个特例,是面向对象中不可缺少的一种基本关系。

在面向对象领域里,实例与类型不是唯一的一对可描述的抽象关系,在JavaScript 中,另外一种重要的抽象关系是类型(Type)与原型(prototype)。

这种关系是一种更高层次的抽象关系,它恰好和类型与实例的抽象关系构成了一个三层的链。

在现实生活中,我们常常说,某个东西是以另一个东西为原型创作的。

这两个东西可以是同一个类型,也可以是不同类型。

习语“依葫芦画瓢”,这里的葫芦就是原型,而瓢就是类型,用JavaScript 的prototype 来表示就是“瓢.prototype = 某个葫芦”或者“瓢.prototype= new 葫芦()”。

要深入理解原型,可以研究关于它的一种设计模式——prototype pattern,这种模式的核心是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

JavaScript 的prototype 就类似于这种方式。

关于prototype pattern 的详细内容可以参考《设计模式》(《Design Patterns》)它不是本文讨论的范围。

注意,同类型与实例的关系不同的是,原型与类型的关系要求一个类型在一个时刻只能有一个原型(而一个实例在一个时刻显然可以有多个类型)。

对于JavaScript 来说,这个限制有两层含义,第一是每个具体的JavaScript 类型有且仅有一个原型(prototype),在默认的情况下,这个原型是一个Object 对象(注意不是Object 类型!)。

第二是,这个对象所属的类型,必须是满足原型关系的类型链。

例如p1 所属的类型是Point 和Object,而一个Object 对象是Point 的原型。

假如有一个对象,它所属的类型分别为ClassA、ClassB、ClassC和Object,那么必须满足这四个类构成某种完整的原型链。

有意思的是,JavaScript 并没有规定一个类型的原型的类型(这又是一段非常拗口的话),因此它可以是任何类型,通常是某种对象,这样,对象-类型-原形(对象)就可能构成一个环状结构,或者其它有意思的拓扑结构,这些结构为JavaScript 带来了五花八门的用法,其中的一些用法不但巧妙而且充满美感。

下面的一节主要介绍prototype 的用法。

2、prototype 使用技巧在了解prototype 的使用技巧之前,首要先弄明白prototype 的特性。

首先,JavaScript为每一个类型(Type)都提供了一个prototype 属性,将这个属性指向一个对象,这个对象就成为了这个类型的“原型”,这意味着由这个类型所创建的所有对象都具有这个原型的特性。

另外,JavaScript 的对象是动态的,原型也不例外,给prototype 增加或者减少属性,将改变这个类型的原型,这种改变将直接作用到由这个原型创建的所有对象上,例如:<script>function Point(x,y) {this.x = x;this.y = y;}var p1 = new Point(1,2);var p2 = new Point(3,4);Point.prototype.z = 0; //动态为Point 的原型添加了属性alert(p1.z);alert(p2.z); //同时作用于Point 类型创建的所有对象</script>结果:第一次:0 第二次:0如果给某个对象的类型的原型添加了某个名为a 的属性,而这个对象本身又有一个名为a 的同名属性,则在访问这个对象的属性a 时,对象本身的属性“覆盖”了原型属性,但是原型属性并没有消失,当你用delete 运算符将对象本身的属性a 删除时,对象的原型属性就恢复了可见性。

利用这个特性,可以为对象的属性设定默认值,例如:<script>function Point(x, y) {if(x) this.x = x;if(y) this.y = y;}Point.prototype.x = 0;Point.prototype.y = 0;var p1 = new Point;var p2 = new Point(1,2);alert(p1.x+" "+p1.y);alert(p1.x+" "+p1.y);</script>结果:第一次:0 0 第二次:0 0上面的例子通过prototype 为Point 对象设定了默认值(0,0),因此p1 的值为(0,0),p2 的值为(1,2),通过delete p2.x, delete p2.y; 可以将p2 的值恢复为(0,0)。

下面是一个更有意思的例子:<script>function classA() {this.a = 100;this.b = 200;this.c = 300;this.reset = function() {for(var each in this){delete this[each];}}}classA.prototype = new classA();var a = new classA();alert(a.a);a.a *= 2;a.b *= 2;a.c *= 2;alert(a.a);alert(a.b);alert(a.c);a.reset(); //调用reset 方法将a 的值恢复为默认值alert(a.a);alert(a.b);alert(a.c);</script>利用prototype 还可以为对象的属性设置一个只读的getter,从而避免它被改写。

下面是一个例子:<script>function Point(x, y) {if(x) this.x = x;if(y) this.y = y;}Point.prototype.x = 0;Point.prototype.y = 0;function LineSegment(p1, p2) {//私有成员var m_firstPoint = p1;var m_lastPoint = p2;var m_width = {valueOf : function(){return Math.abs(p1.x - p2.x)},toString : function(){return Math.abs(p1.x - p2.x)}}var m_height = {valueOf : function(){return Math.abs(p1.y - p2.y)},toString : function(){return Math.abs(p1.y - p2.y)}}//getterthis.getFirstPoint = function() {return m_firstPoint;}this.getLastPoint = function() {return m_lastPoint;}this.length = {valueOf : function(){return Math.sqrt(m_width*m_width+m_height*m_height)},toString : function(){return Math.sqrt(m_width*m_width + m_height*m_height)}}}var p1 = new Point;var p2 = new Point(2,3);var line1 = new LineSegment(p1, p2);var lp = line1.getFirstPoint();lp.x = 100; //不小心改写了lp 的值,破坏了lp 的原始值而且不可恢复alert(line1.getFirstPoint().x);alert(line1.length); //就连line1.lenght 都发生了改变</script>将this.getFirstPoint()改写为下面这个样子:this.getFirstPoint = function() {function GETTER(){};GETTER.prototype = m_firstPoint;return new GETTER();}则可以避免这个问题,保证了m_firstPoint 属性的只读性。

<script>function Point(x, y) {if(x) this.x = x;if(y) this.y = y;}Point.prototype.x = 0;Point.prototype.y = 0;function LineSegment(p1, p2) {//私有成员var m_firstPoint = p1;var m_lastPoint = p2;var m_width = {valueOf : function(){return Math.abs(p1.x - p2.x)},toString : function(){return Math.abs(p1.x - p2.x)}}var m_height = {valueOf : function(){return Math.abs(p1.y - p2.y)},toString : function(){return Math.abs(p1.y - p2.y)}}//getterthis.getFirstPoint = function() {function GETTER(){};GETTER.prototype = m_firstPoint;return new GETTER();}this.getLastPoint = function() {function GETTER(){};GETTER.prototype = m_lastPoint;return new GETTER();}this.length = {valueOf : function(){return Math.sqrt(m_width*m_width + m_height*m_height)},toString : function(){return Math.sqrt(m_width*m_width + m_height*m_height)}}}var p1 = new Point;var p2 = new Point(2,3);var line1 = new LineSegment(p1, p2);var lp = line1.getFirstPoint();lp.x = 100; //不小心改写了lp 的值,但是没有破坏原始的值alert(line1.getFirstPoint().x);alert(line1.length); //line1.lenght 不发生改变</script>实际上,将一个对象设置为一个类型的原型,相当于通过实例化这个类型,为对象建立只读副本,在任何时候对副本进行改变,都不会影响到原始对象,而对原始对象进行改变,则会影响到副本,除非被改变的属性已经被副本自己的同名属性覆盖。

相关文档
最新文档