JavaScript函数constructor的作用,意义
前几天写了一片 如何用正确的姿势编写jQuery插件 有朋友拍砖,指正。再此谢谢!
讨论:指定函数的constructor作用到底是什么?
我们一般写jQuery插件的时候是这样的:
//构造函数
function Person(options) {
this.name = "";
this.age = -1;
$.extend(this, options);
}
Person.prototype = {
getName: function () {
return this.name;
},
getAge: function () {
return this.age;
}
}
//调用
var person1 = new Person({ name: "zhangsan", age: 18 });
console.log(person1.getName()); //zhangsan
console.log(person1.constructor); //Object
从上面可以看出,我们在添加实例person1的时候在构造函数里面合并了this和options,虽然person1可以构造函数Person()的方法,
但是person1.constructor(也就是person1的构造函数返回的是Object),而我们明明是用Person()创建的,这里就需要指定一下constructor;
Person.prototype = {
constructor: Person,
getName: function () {
return this.name;
},
getAge: function () {
return this.age;
}
}
在群里讨论,我指定、不指定到底有什么用,我创建的实例都可以用我构造函数的方法? 到底有什么用处呢?如下:
var person2;
(function () {
function Person(opt) {
this.name = opt.name || "";
this.age = opt.age || "";
}
//请注意这里这么写和上面是有区别的 Person.prototype ={} 是改了整个原型,这是只是新增方法
Person.prototype.getName = function () {
console.log(this.name);
}
person2 = new Person({ name: "wangwu", age: 17});
})()
person2.getName(); //wangwu
person2.constructor //Person()
假如我想给闭包里面的构造函数扩张一个方法怎么弄呢?从代码上看可以知道person2的构造函数是Person(),那么就可以有以下方法:
person2.constructor.prototype.getAge = function () {
console.log(this.age);
}
person2.getAge(); //
可以不用看,不用寻找闭包里面的功能,直接在实例的构造函数的原型上加就行。
注意:person2.constructor.prototype.getAge = function () {} 不是修改整个构造函数的原型,而是新增属性。
这里说明一下在编写jQuery插件的时候还是要避免:覆盖了原型prototype没有重新指向其构造函数;
那样用户就可以在实例里面找到构造函数而添加方法了。
欢迎继续拍砖指正,这样的记忆是最牢固深刻的!
JavaScript函数constructor的作用,意义的更多相关文章
- JavaScript函数之作用域 / 作用链域 / 预解析
关于作用域和作用链域的问题,很多文章讲的都很详细,本文属于摘录自己觉得对自己有价值的部分,留由后用,仅供参考,需要查看详细信息请点击我给出的原文链接查看原文件 做一个有爱的搬运工~~ -------- ...
- Javascript函数重载,存在呢—还是存在呢?
1.What's is 函数重载? );//Here is int 10 print("ten");//Here is string ten } 可以发现在C++中会根据参数的类型 ...
- 深入理解javascript函数系列第二篇——函数参数
× 目录 [1]arguments [2]内部属性 [3]函数重载[4]参数传递 前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传 ...
- 理解JavaScript函数参数
前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数. arguments javascri ...
- 深入理解JavaScript函数参数
前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数. arguments javascri ...
- javaScript系列 [01]-javaScript函数基础
[01]-javaScript函数基础 1.1 函数的创建和结构 函数的定义:函数是JavaScript的基础模块单元,包含一组语句,用于代码复用.信息隐蔽和组合调用. 函数的创建:在javaScri ...
- 深入理解JavaScript函数
本篇文章主要介绍了"深入理解JavaScript函数",主要涉及到JavaScript函数方面的内容,对于深入理解JavaScript函数感兴趣的同学可以参考一下. JavaScr ...
- Javascript属性constructor/prototype的底层原理
在Javascript语言中,constructor属性是专门为function而设计的,它存在于每个function的prototype属性中. 这个constructor保存了指向function ...
- Javascript object.constructor属性与面向对象编程(oop)
定义和用法 在 JavaScript 中, constructor 属性返回对象的构造函数. 返回值是函数的引用,不是函数名: JavaScript 数组 constructor 属性返回 funct ...
随机推荐
- 数字游戏II
题面好难找:嘟嘟嘟 贪心 + dp. 首先要按bi的降序排序,让每一次减少大的数尽量靠前.为啥咧?于是我们就需要证明:令sum = a1 - (1 - 1) * b1 + a2 - (2 - 1) * ...
- [18/11/28]Java中的包(package)
一.为何引入包? 包机制是Java中管理类的重要手段. 开发中,我们会遇到大量同名的类,通过包我们很容易对解决类重名的问题,也可以实现对类的有效管理. 包对于类,相当于文件夹对于文件的作用.(同一文件 ...
- hibermate一对一关联
在hibernate.cfg.xml配置<mapping class="oneToOne.IDCard" />,以及实体类的get和set方法省略了. User类 @E ...
- WebStorm11 注册码及激活
网址:http://www.jianshu.com/p/5ce394a28ce5 1.获取注册码 打开第一个网址(IntelliJ IDEA 注册码),我们能看到下面的界面,直接点击获取激活码,将生成 ...
- python-函数的使用
一.函数的定义 首先,我们来看一个简单的例子来定义函数: def test(): print('hello') 在其中 def : 关键字,用来告诉解释器,接下来的一段代码是一个函数 test : ...
- maven项目 servlet jar包冲突
Failed to process JAR found at URL for ServletContainerInitializers for context with name [{1}] 启动报 ...
- 关于A*估价函数的总结
估价函数的优劣决定一个A*算法的好坏 360百科上是这样说的: (https://baike.so.com/doc/6223470-6436780.html) 关于估价函数h(n)与实际距离d(n)的 ...
- Struts2 第六讲 -- Struts2的结果类型
7.struts2的结果类型 l 每个 action 方法都将返回一个 String 类型的值, Struts 将根据这个值来决定响应什么结果. l 每个 Action 声明都必须包含有数量足够多的 ...
- python语言验证码识别,以后不用老输入验证码了。
1.Python 3.6 安装包 1.要加环境变量 2.pip安装PIL库 3.pip安装pytesseract模块 2.tesseract-ocr-setup-4.00.00dev.exe -- ...
- iOS 语言国际化配置
所谓的iOS 国际化,就是根据系统不同的语言自动切换. 首先,如图: 创建一个.strings文件,以“Localizable.strings”为文件名: 创建完之后,在XCode的右边勾选自 ...