面向对象的Js-JavaScript的特点

1. JavaScript灵活性
用不同方式定义方法:
1. 使用方法定义的方式
function startAnimation() {
  ...
}

function stopAnimation() {
  ...
}
2. 使用原形方式
var Anim = function() {
  ...
};
Anim.prototype.start = function() {
  ...
};
Anim.prototype.stop = function() {
  ...
};

var myAnim = new Anim();
myAnim.start();
...
myAnim.stop();
3. 使用另一种不同的方式
var Anim = function() {
  ...
};
Anim.prototype = {
  start: function() {
    ...
  },
  stop: function() {
    ...
  }
};
4. 为Function类添加方法用于声明方法
Function.prototype.method = function(name, fn) {
  this.prototype[name] = fn;
};

var Anim = function() {
  ...
};
Anim.method('start', function() {
  ...
});
Anim.method('stop', function() {
  ...
});
5. 链式调用
Function.prototype.method = function(name, fn) {
    this.prototype[name] = fn;
    return this;
};

var Anim = function() {
  ...
};
Anim.
  method('start', function() {
    ...
  }).
  method('stop', function() {
    ...
  });
2. 弱类型语言
在JavaScript中,定义变更时不必声明其类型。并不意味着变更没有类型,一个变量可以属于几种类型之一,这取决于其包含的数据。
JavaScript中有五种原始值:Undefined,Null,Boolean,Number,String
Undefined数据类型的值只有一个:undefined
  在js中如果只声明了一个引用,没有值,那么它的值默认就是undefind.
Null数据类型的值只有一个:null
Boolean数据类型的值只有两个:true,false
Number任何整数、浮点值都是在number里的值
typeof的返回值有五个:undefined,boolean,number,string,object
null与undefined的关系:undefined实际上从null派生而来
    alert(null == undefined);
对于函数定义中的变量来说,加var表示局部变量,不加var表示全局变量
强制转换有三种:Boolean(value),Number(value),String(value)

String s = ‘s’  alert(typeof s) string   // 是原始值,放在栈里
String s = new String(‘s’);  alert(typeof s) object // 对象,放在堆里

3. 函数
在JavaScript中,函数是一等对象。它们可以存储在变更中,可以作为参数传给其它函数,可以作为返回值从其它函数传出,还可以在运行时进行构造。
可用function() {..}这样的语法创建匿名函数。它们没有函数名,但可以被赋给变量
(function() {
  var foo = 10;
  var bar = 2;
  alert(foo * bar);
})();

(function(foo, bar) {
  alert(foo * bar);
})(10, 2);

var baz = (function(foo, bar) {
  return foo * bar;
})(10, 2);
4. 对象的易变性(晚绑定)
早绑定:是指在实例化对象之前定义它的特性和方法,这样编译器或解释程序就能提前转换机器代码。
晚绑定:指的是编译器或解释程序在运行前,不知道对象的类型。使用晚绑定,无需检查对象的类型,只需要检查对象是否支持特性和方法即可
JavaScript的对象具有易变性。这意味着能使用一些在大多数别的语言中不能使用的技术,例如为函数加属性:
function displayError(message) {
  displayError.numTimesExecuted++;
  alert(message);
};
displayError.numTimesExecuted = 0;
上面例子意味着你可以对先前定义的类和实例化的对象进行修改;
// 定义一个person类
function Person(name, age) {
  this.name = name;

  this.age = age;
}

// 定义其方法
Person.prototype = {
  getName: function() {
    return this.name;
  },
  getAge: function() {
    return this.age;
  }
}

 // 实例化对象
var alice = new Person('Alice', 93);
var bill = new Person('Bill', 30);

// 修改类,再为其添加一个方法
Person.prototype.getGreeting = function() {
  return 'Hi ' + this.getName() + '!';
};

// 修改特定的实例
alice.displayGreeting = function() {
  alert(this.getGreeting());
}

var o = new Object();

o.name = "langsin";

alert(o.name);

delete o.name;

alert(o.name);

你可能感兴趣的:(JavaScript,prototype)