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 ...
随机推荐
- POJ 3020 Antenna Placement 【最小边覆盖】
传送门:http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total ...
- maven之构建多模块maven工程
(一)环境搭建 1.Maven下载 ; http://maven.apache.org/download.cgi 第一个在Linux使用,第二个是在Windows,第三和第四是源码: 我们将下 ...
- js 中获取 日期
运行结果
- 【luogu P4113 [HEOI2012]采花】 假题解
题目链接:https://www.luogu.org/problemnew/show/P4113 为什么要卡莫队!为什么加强的这么毒瘤! 莫队可以拿100分剩下三个点没治了 // luogu-judg ...
- normal 普通身份 sysdba 系统管理员身份 sysoper 系统操作员身份 dba和sysdba
as sysdba 就是以sysdba登录,oracle登录身份有三种:normal 普通身份sysdba 系统管理员身份sysoper 系统操作员身份每种身份对应不同的权限 sysdba权限:●启动 ...
- linux系统命令与常识
之前短期学过linux,用到时才发现已经忘得一干二净了. 现在对学过的和了解到的做一个总结: 先明确一些使用工具: winscp : WinSCP是一个Windows环境下使用SSH的开源图形化SFT ...
- JavaScript js调用堆栈(二)
本文主要介绍JavaScript的内存空间 var a = 20; var b = 'abc'; var c = true; var d = { m: 20 } 首先需要对栈(stack),堆(hea ...
- Django-rest-framework(八)使用技巧(持续补充中)
当viewset中,多个action对应了不同的serializers的时候 class UserView(viewsets.GenericViewSet): queryset = User.obje ...
- Java程序如何生成Jar 执行文件(1)
一.用Eclipse生产Jar文件 注意:此方法只能打包简单程序,不包含含有第三方jar包的项目 首先,看一下我的项目的目录结构: 1,项目名字上面点右键,选择Export,在选择java\JAR f ...
- C++调用WMI类查询获取操作系统名
#define _WIN32_DCOM #include <iostream> #include <comdef.h> #include <Wbemidl.h> u ...