《悟透JavaScript》学习札记十之原型扩展

1.示例:扩展String的trim功能

<script type="text/javascript">
 // from MicrosoftAjax.debug.js
 String.prototype.trim = function String$trim(){ //黄色部分没有亦可,不知此处$作用,还请高手指教!
  if (arguments.length !== 0) throw Error.parameterCount();
  return this.replace(/^\s+|\s+$/g,""); // 去处前后空格
 }

 function clickMe(){
  var text1 = document.getElementById('txt1').value; // input: kevin wang, 前后各有2个空格
  var text2 = text1.trim();
  alert(text1.length); // 14
  alert(text2.length); // 10

 }
 </script>
 <input type="text" id="txt1" />
 <input type="button" value="Click" onclick="clickMe()"/>

2.示例:原型模型

<script type="text/javascript">
  function Person(name)
  {
   this.name = name;
  };
  Person.prototype.SayHello = function()
  {
   alert("Hello, I'm " + this.name);
  };
  function Employee(name,salary)
  {
   Person.call(this, name); // 调用上层构造函数
   this.salary = salary;
  };
  // 子类构造函数首先需要用上层构造函数来建立prototype对象,来实现继承的概念
  Employee.prototype = new Person(); // 若没有这个定义,则下面Mike.SayHello()执行不了
  // 子类方法也定义到构造函数之上
  Employee.prototype.ShowSalary = function()
  {
   alert(this.name + " $ " + this.salary);
  };
  var Kevin = new Person("Kevin");
  Kevin.SayHello();
  var Mike = new Employee("Mike", 5000);
  Mike.SayHello();
  Mike.ShowSalary();
 </script>

 注:在上述原型模型中,为了实现继承,必须首先将子类构造函数的prototype设置为一个父类的对象实例(蓝色标注)。创建这个父类对象实例的目的就是为了构成原型链,以起到共享上层原型方法的作用。但创建这个实例对象时,上层构造函数也会给它设置对象成员,这些对象成员对于继承来说是没有意义的。虽然,我们也没有给构造函数传递参数,但确实创建了若干没有用的成员,尽管其值是undefined,这也是一种浪费啊。所以说,世界上没有完美的事情啊!

持续更新中......

你可能感兴趣的:(JavaScript,function,String,prototype,扩展,button)