原型链:
Object(构造函数) object(类型(对象))
var o = {}; alert(typeof o); //结果是object alert(typeof Object); //结果是function
每一个对象都有一个属性叫 __proto__ ,这个属性就是这个对象的原型(o. __proto__),
函数可通过 函数名.prototype 获取原型,对象可以通过 对象.__proto__(双下划线)获取。
对象有原型,原型也是对象,所以原型也有原型,所有的函数都是对象,继承自Function.prototype,
Function.prototype是对象,继承自Object.prototype,Object.prototype是对象,继承自null。
o是对象,继承自Object.prototype
Function是对象,继承自Function.prototype
Function是函数,继承自Function.prototype
js成员的访问规则:
o.方法()
首先在o当前这个类型中寻找该成员的定义,如果存在该成员的定义,那么就直接使用改成员;
如果该成员不再当前类型中,就访问其原型(原型链中的上一级)以此类推,直到null位置。
代码示例:
不使用继承:
var Person = function() { this.say = function() { alert("你好"); }; }; var p1 = new Person(); var p2 = new Person(); alert(p1.say === p2.say); //结果为false
每new一个对象,就会创建一块新的内存,所以p1.say和怕p2.say并不是引用的同一个地址
使用原型继承:
var Person = function() { }; Person.prototype = { say:function(){ alert("Mr靖"); } }; var p1 = new Person(); var p2 = new Person(); p1.__proto__.name = "Mr靖"; alert(p1.say === p2.say); //结果是true alert(p2.name); //结果为"Mr靖"
模拟c#中的类:
var o = { say:function() { alert("你好,我是" + this.name + ",我今年" + this.age + "岁了,我是" + this.sex + "生"); }, get_Name : function() { return this.name; }, set_Name : function(value) { this.name = value; } }; var Person = function(name,age,sex) { this.name = name; this.age = age; this.sex = sex; }; Person.prototype = o; //类似于让Person类继承父类o var p1 = new Person("Mr靖", 19, "男"); p1.say();
一般的继承做法:
var inherite = function(name) { this.name = name; }; var o = { sayHello:function() { alert("你好,我是" + (this.name||"不存在")); } }; inherite.call(o, "Mr靖"); //函数inherit中this.name=name相当于在对象o中添加name属性,并把"Mr靖"赋值给它 o.sayHello(); alert(o.name);