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 ...
随机推荐
- [18/12/03] 多态(polymorphism)和对象的转型(casting)
一.多态 多态指的是同一个方法调用,由于对象不同可能会有不同的行为.现实生活中,同一个方法,具体实现会完全不同. 比如:同样是调用人的“休息”方法,张三是睡觉,李四是旅游,同样是调用人“吃饭”的方法, ...
- PHP设计模式——适配器模式
<?php /** * 适配器模式 * 适配器模式是将某个对象的接口适配为另一个对象所期望的接口 * * 在需要转化一个对象的接口用于另一个对象时,最好实现适配器模式对象 */ class We ...
- springMVC+thymeleaf form表单提交前后台数据传递
后端: @RequestMapping(value = "/add", method=RequestMethod.POST) public String save(@ModelAt ...
- Android学习笔记_5_文件操作
1.Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的. package com.example.servi ...
- hadoop二次排序
import java.io.DataInput; import java.io.DataOutput; import java.io.File; import java.io.IOException ...
- override render 方法
有时候需要在ASP.net 或MVC 中在页面呈现前,把要显示的内容作一个拦截,更改内容后显示. 只要重写 protected override void Render(System.Web.UI. ...
- Unity】Socket 同步与异步
http://blog.csdn.net/ldy597321444/article/details/51519157
- mysql忘记密码重置
一.更改my.cnf配置文件 0.MySQL 版本查看 mysql --version 1.用命令编辑/etc/my.cnf配置文件,即:vim /etc/my.cnf 或者 vi /etc/my.c ...
- 带你解析Java类加载机制
目录 Java类加载机制的七个阶段 加载 验证 准备(重点) 解析 初始化(重点) 使用 卸载 实战分析 方法论 树义有话说 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如 ...
- ABAP术语-Application Server
Application Server 原文:http://www.cnblogs.com/qiangsheng/archive/2007/12/17/1002777.html Server that ...