教程javascript的function(函数)(7)

作者:子乌 来源:蓝色理想 时间:2007-09-30 13:38:00 

将函数作为属性

任何类型的对象都可以作为一个属性,回忆一下前面的Example 4(不是Example DT4),函数也是一个对象。所以你可以让一个函数作为一个对象的一个属性。下面,我将添加两个函数getSalary和addSalary。

Example DT7

CODE:

function Employee(name, salary)
{
  this.name=name;               
  this.salary=salary;

  this.addSalary=addSalaryFunction;

  this.getSalary=function()
                 {
                   return this.salary;
                 };
}
function addSalaryFunction(addition)
{
  this.salary=this.salary+addition;
}

var boss=new Employee("John", 200000);
boss.addSalary(10000);                    // boss 长了 10K 工资……为什么老板工资可以长这么多:'(
alert(boss.getSalary());                  // 输出 210K……为什么默认工资也那么高……:'(

addSalary和getSalary演示了几种将函数赋给属性的不同方法。如果你记得我们最开始的讨论;我讨论了三种声明函数的不同方式。所有那些在这里都是适用的,但是上面展示的两个最常用。

让我们看看有什么不同。下面,注意一下9-12行的代码。当这部分代码执行的时候,函数getSalary被声明。如前面数次提到的,一个函数声明的结果是一个对象被创建。所以这时候boss被创建(接下来的第19行),而boss里有一个getSalary属性。

CODE:

function Employee(name, salary)
{
  this.name=name;               
  this.salary=salary;

  this.addSalary=addSalaryFunction;

  this.getSalary=function()
                 {
                   return this.salary;
                 };
}
function addSalaryFunction(addition)
{
  this.salary=this.salary+addition;
}

var boss=new Employee("John", 200000);
var boss2=new Employee("Joan", 200000);
var boss3=new Employee("Kim", 200000);


当你创建这个对象的更多实例时(boss2和boss3),每一个实例都有一份getSalary代码的单独拷贝;而与此相反,addSalary则指向了同一个地方(即addSalaryFunction)。 

看看下面的代码来理解一下上面所描述的内容。

Example DT8

CODE:

function Employee(name, salary)
{
  this.name=name;               
  this.salary=salary;

  this.addSalary=addSalaryFunction;
  this.getSalary=function()
                 {
                   return this.salary;
                 };
}
function addSalaryFunction(addition)
{
  this.salary=this.salary+addition;
}

var boss1=new Employee("John", 200000);
var boss2=new Employee("Joan", 200000);


// 给getSalary函数对象添加属性
boss1.getSalary.owner="boss1";
boss2.getSalary.owner="boss2";
alert(boss1.getSalary.owner);   // 输出 "boss1"
alert(boss2.getSalary.owner);   // 输出 "boss2"
// 如果两个对象指向同一个函数对象,那么
// 上面两个输出都应该是“boss2”。

// 给addSalary函数对象添加属性
boss1.addSalary.owner="boss1";
boss1.addSalary.owner="boss2";
alert(boss1.addSalary.owner);   // 输出 "boss2"
alert(boss2.addSalary.owner);   // 输出 "boss2"
// 因为两个对象都指向同一个函数,(子乌注:原文写are not pointing to the same function,疑为笔误)
// 当修改其中一个的时候,会影响所有的实例(所以两个都输出“boss2”).


也许不是重要的事情,但这里有一些关于运行类似上面的getSalary的内嵌函数的结论: 1) 需要更多的存储空间来存储对象(因为每一个对象实例都会有它自己的getSalary代码拷贝);2) javascript需要更多时间来构造这个对象。

让我们重新写这个示例来让它更有效率些。

Example DT9

CODE:

function Employee(name, salary)
{
  this.name=name;               
  this.salary=salary;

  this.addSalary=addSalaryFunction;
  this.getSalary=getSalaryFunction;
}
function getSalaryFunction()
{
  return this.salary;
}

function addSalaryFunction(addition)
{
  this.salary=this.salary+addition;
}


看这儿,两个函数都指向同一个地方,这将会节约空间和缩短构造时间(特别是当你有一大堆内嵌函数在一个构造函数的时候)。这里有另外一个函数的功能能够来提升这个设计,它叫做prototype,而我们将在下一节讨论它。

标签:function,函数
0
投稿

猜你喜欢

  • python 插入日期数据到Oracle实例

    2022-09-29 23:51:59
  • Python MySQL 日期时间格式化作为参数的操作

    2024-01-12 23:52:13
  • 小米正式开源 SQL 智能优化与改写工具 SOAR

    2024-01-20 09:34:56
  • python人工智能tensorflow函数np.random模块使用

    2021-03-02 20:05:55
  • SQL SERVER迁移之更换磁盘文件夹的完整步骤

    2024-01-25 18:37:59
  • Django+mysql配置与简单操作数据库实例代码

    2024-01-14 09:19:28
  • MySQL中BIGINT数据类型如何存储整数值

    2024-01-23 21:15:45
  • 解决django-xadmin列表页filter关联对象搜索问题

    2023-01-13 22:19:13
  • Python元组定义及集合的使用

    2023-11-22 12:32:03
  • python查询MySQL将数据写入Excel

    2023-12-15 13:48:11
  • MYSQL实现连续签到功能断签一天从头开始(sql语句)

    2024-01-22 16:35:11
  • 一文解决django 2.2与mysql兼容性问题

    2024-01-28 03:26:01
  • 节日快乐! Python画一棵圣诞树送给你

    2022-06-11 07:53:09
  • 介绍Python的Django框架中的QuerySets

    2021-04-19 18:58:32
  • pytorch 如何使用float64训练

    2023-08-12 00:19:45
  • new_zeros() pytorch版本的转换方式

    2022-07-31 17:32:36
  • Python 如何用一行代码实现for循环初始化数组

    2022-06-19 07:56:41
  • 接口数据安全保证的10种方式

    2022-06-08 08:59:35
  • javascript中注册和移除事件的4种方式

    2024-04-22 12:49:02
  • 设计"以人为本"和"绿色设计"

    2008-10-07 12:21:00
  • asp之家 网络编程 m.aspxhome.com