另类编辑距离-c#求解-英雄会在线编程题目

Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。

那么,如果我们要把"属性"(property)和"方法"(method),封装成一个对象,甚至要从原型对象生成一个实例对象,我们应该怎么做呢?

一、 生成对象的原始模式

假定我们把猫看成一个对象,它有"名字"和"颜色"两个属性。

  var Cat = {

    name : ‘‘,

    color : ‘‘

  }

现在,我们需要根据这个原型对象的规格(schema),生成两个实例对象。

  var cat1 = {}; // 创建一个空对象

    cat1.name = "大毛"; // 按照原型对象的属性赋值

    cat1.color = "黄色";

  var cat2 = {};

    cat2.name = "二毛";

    cat2.color = "黑色";

好了,这就是最简单的封装了,把两个属性封装在一个对象里面。但是,这样的写法有两个缺点,一是如果多生成几个实例,写起来就非常麻烦;二是实例与原型之间,没有任何办法,可以看出有什么联系。

二、 原始模式的改进

我们可以写一个函数,解决代码重复的问题。

  function Cat(name,color){

    return {

      name:name,

      color:color

    }

  }

然后生成实例对象,就等于是在调用函数:

  var cat1 = Cat("大毛","黄色");

  var cat2 = Cat("二毛","黑色");

这种方法的问题依然是,cat1和cat2之间没有内在的联系,不能反映出它们是同一个原型对象的实例。

三、 构造函数模式

为了解决从原型对象生成实例的问题,Javascript提供了一个构造函数(Constructor)模式。

所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量。对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上。

比如,猫的原型对象现在可以这样写,

  function Cat(name,color){

    this.name=name;

    this.color=color;

  }

我们现在就可以生成实例对象了。

  var cat1 = new Cat("大毛","黄色");

  var cat2 = new Cat("二毛","黑色");

  alert(cat1.name); // 大毛

  alert(cat1.color); // 黄色

这时cat1和cat2会自动含有一个constructor属性,指向它们的构造函数。

  alert(cat1.constructor == Cat); //true

  alert(cat2.constructor == Cat); //true

Javascript还提供了一个instanceof运算符,验证原型对象与实例对象之间的关系。

  alert(cat1 instanceof Cat); //true

  alert(cat2 instanceof Cat); //true

四、构造函数模式的问题

构造函数方法很好用,但是存在一个浪费内存的问题。

请看,我们现在为Cat对象添加一个不变的属性"type"(种类),再添加一个方法eat(吃老鼠)。那么,原型对象Cat就变成了下面这样:

  function Cat(name,color){

    this.name = name;

    this.color = color;

    this.type = "猫科动物";

    this.eat = function(){alert("吃老鼠");};

  }

还是采用同样的方法,生成实例:

  var cat1 = new Cat("大毛","黄色");

  var cat2 = new Cat ("二毛","黑色");

  alert(cat1.type); // 猫科动物

  cat1.eat(); // 吃老鼠

表面上好像没什么问题,但是实际上这样做,有一个很大的弊端。那就是对于每一个实例对象,type属性和eat()方法都是一模一样的内容,每一次生成一个实例,都必须为重复的内容,多占用一些内存。这样既不环保,也缺乏效率。

  alert(cat1.eat == cat2.eat); //false

能不能让type属性和eat()方法在内存中只生成一次,然后所有实例都指向那个内存地址呢?回答是可以的。

五、 Prototype模式

Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。

这意味着,我们可以把那些不变的属性和方法,直接定义在prototype对象上。

  function Cat(name,color){

    this.name = name;

    this.color = color;

  }

  Cat.prototype.type = "猫科动物";

  Cat.prototype.eat = function(){alert("吃老鼠")};

然后,生成实例。

  var cat1 = new Cat("大毛","黄色");

  var cat2 = new Cat("二毛","黑色");

  alert(cat1.type); // 猫科动物

  cat1.eat(); // 吃老鼠

这时所有实例的type属性和eat()方法,其实都是同一个内存地址,指向prototype对象,因此就提高了运行效率。

  alert(cat1.eat == cat2.eat); //true

六、 Prototype模式的验证方法

为了配合prototype属性,Javascript定义了一些辅助方法,帮助我们使用它。,

6.1 isPrototypeOf()

这个方法用来判断,某个proptotype对象和某个实例之间的关系。

  alert(Cat.prototype.isPrototypeOf(cat1)); //true

  alert(Cat.prototype.isPrototypeOf(cat2)); //true

6.2 hasOwnProperty()

每个实例对象都有一个hasOwnProperty()方法,用来判断某一个属性到底是本地属性,还是继承自prototype对象的属性。

  alert(cat1.hasOwnProperty("name")); // true

  alert(cat1.hasOwnProperty("type")); // false

6.3 in运算符

in运算符可以用来判断,某个实例是否含有某个属性,不管是不是本地属性。

  alert("name" in cat1); // true

  alert("type" in cat1); // true

in运算符还可以用来遍历某个对象的所有属性。

  for(var prop in cat1) { alert("cat1["+prop+"]="+cat1[prop]); }

今天就写到这里,如果感兴趣,请继续关注!

另类编辑距离-c#求解-英雄会在线编程题目,布布扣,bubuko.com

时间: 2024-10-12 02:34:05

另类编辑距离-c#求解-英雄会在线编程题目的相关文章

火车调度-c#求解-英雄会在线编程题目

题目: 火车调度 返回首页 发布公司: 有 效 期: 赛 区: CSDN 2014-04-30至2015-04-30 北京 难 度 等 级: 答 题 时 长: 编程语言要求: 120分钟 C C++ Java C# 题目详情 火车从A地和B地之间运行,你知道火车从某地出发的时间和到达某地的时间(这个时间出发,一定这个时候到达).火车到达目的地后,不能立刻返回,需要经过t分钟检修才可以返回.列车只在A.B两地运行.你知道每天内的时刻表,求A,B两地各需要存放多少辆列车,才能满足这个时刻表?即只要该

F(X)--c#求解-英雄会在线编程题目

先看题目: F(X) 发布公司: 有 效 期: 赛 区: CSDN 2014-04-16至2015-04-16 北京 难 度 等 级: 答 题 时 长: 编程语言要求: 120分钟 C C++ Java C# 题目详情 我们定义 F(x)是满足 x  mod(a*b) == 0这样的a,b的组数.现在给你一个n,你需要求出 F(n) 输入格式: 多组数据,每组第一行有一个整数n, 0 < n <= 10^11. 输出格式: 每组输出一行,满足条件的(a,b)对数 答题说明 输入样例 1 2 3

网易云课堂_C++程序设计入门(下)_期末考试_期末考试在线编程题目

期末考试在线编程题目 返回考试 本次考试题目一共两个,在考试期间可以不限制次数地提交 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成绩. 1 编写一个模板类型的 max 函数,求取三个输入的数据中最大的一个,将其输出(10分) 题目内容: 编写一个模板类型的max函数,该函数接收三个参数,返回其中最大的一个. 在主函数中接受键盘输入的三个数据(用空格分隔),并且将最大的一个值输出到屏幕上(

微软2014实习生及校招秋令营技术类职位,在线编程题目及解答。

题目1 : String reorder 时间限制:10000ms 单点时限:1000ms 内存限制:256MB Description For this question, your program is required to process an input string containing only ASCII characters between '0' and '9', or between 'a' and 'z' (including '0', '9', 'a', 'z'). Y

【平安科技】在线编程大赛活动

1. 活动名称:[现金大奖]平安科技在线编程大赛:一份"奇妙"的银行流水 题目详情: 一份银行流水数据,因打印模糊导致部分金额不清楚. 收入.支出.余额满足以下3条规则: 1.收入.支出.余额三列都是数字 2.同一行收入和支出的值不能同时为非零值 3.第N-1行余额(+第N行收入或-第N行支出)=第N行余额 程序语言: java 请按照规则编写算法,修复不清楚的值 输入描述: 输入数据最多25行,每行都包含四个数据,分别是:数据编号,收入.支出.余额,模糊的数据以?表示,它们之间以;隔

第五届在线编程大赛月赛第一题:完全平方数的个数

第五届在线编程大赛月赛第一题:完全平方数的个数 题目详情: 给定整数区间[A,B]问其中有多少个完全平方数. 输入格式: 多组数据,包含两个正整数A,B 1<=A<=B<=2000000000. 输出格式: 每组数据输出一行包含一个整数,表示闭区间[A,B]中包含的完全平方数的个数. 答题说明: 输入样例 1 1 1 2 3 10 3 3 输出样例: 1 1 2 0 java代码: import java.util.Scanner; public class One { public s

在四川大学的第三个冠军在线编程竞赛:簿传输

好久没有写日志,奇怪的是很特别的更近,最近参加的编程方面是CSDN在学院俱乐部的在线编程插头.说到编程大赛.一共有三个问题.标题都能够csdn学院看到俱乐部.比赛有点紧张时,,第三个问题涉及到队列,提示,坑...也怨自己平时写代码用惯了代码提示,非常多stl的方法都是隐隐约约知道,可是详细的不知道,导致第三题没有做出来,遗憾哈!以下贴一下今天写的第三题的代码 题目 四川大学线下编程比赛第三题:书本转移 题目详情: 小强有 3 个箱子 A,B,C 用来装书,全部的书(一共n本)都按序号由小到大的顺

【编程题目】字符串的排列(字符串)★

53.字符串的排列(字符串).题目:输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串 abc,则输出由字符 a.b.c 所能排列出来的所有字符串abc.acb.bac.bca.cab 和 cba. 这道题花了我一天,要好好总结! 思路:这道题目感觉有些难,主要是字符串中的字符可能会有重复.我的想法是把一共有多少种字符和每种字符出现的次数统计出来,每个位置对这些字符变量,下一个位置的可用字符减小,再遍历. /* 53.字符串的排列(字符串). 题目:输入一个字符串,打印出该字符串中字

【LeetCode在线编程记录-1】字符串按单词反转

写在前面 LeetCode(地址:https://oj.leetcode.com/)是一个在线编程网站,题目经典,测试用例完备,共计157道算法类的题目.之后我会记录我的一些练习题目,有些答案是我自己原创的(说是原创,也很可能是之前在别的地方看到的而已),有些是从讨论区看到的,我都会明确标注出处. Reverse Words in a String Given an input string, reverse the string word by word. For example, Given