WEB开发网
开发学院网页设计JavaScript JavaScript中的原型和对象机制 阅读

JavaScript中的原型和对象机制

 2009-09-23 00:00:00 来源:WEB开发网   
核心提示: functionTest(a,b){alert(a+b);}//相当于:Test=newFunction(["a","b"],"alert(a+b);");Function函数又是由什么创建? 实际上Function是本机代码实现的固有

function Test(a, b)
{
    alert(a+b);
}
// 相当于:
Test = new Function(["a", "b"], "alert(a+b);");

Function函数又是由什么创建? 实际上Function是本机代码实现的固有对象. 不过为了一致性, Function也有constructor属性, 该属性指向它自己. 接上面的代码:

/* 输出 function Function(){
            [native code]
        }
*/
alert(Test.constructor);
alert(Test.constructor.constructor === Test.constructor); // true
alert(Test.constructor === Object.constructor); // true

2 原型prototype

2.1 prototype的概念

prototype是构造函数的一个属性, 该属性指向一个对象. 而这个对象将作为该构造函数所创建的所有实例的基引用(base reference), 可以把对象的基引用想像成一个自动创建的隐藏属性. 当访问对象的一个属性时, 首先查找对象本身, 找到则返回; 若不, 则查找基引用指向的对象的属性(如果还找不到实际上还会沿着原型链向上查找,  直至到根). 只要没有被覆盖的话, 对象原型的属性就能在所有的实例中找到.

原型默认为Object的新实例, 由于仍是对象, 故可以给该对象添加新的属性:

// prototype默认为new Object(); 为了方便, 记为p_obj
function Person(name) {
    this.name = name;
}
// 为 p_obj 增加 sayName 属性
Person.prototype.sayName = function(){
    alert(this.name);
}
var john = new Person("John"); // john 的 base reference指向p_obj
var eric = new Person("Eric");  // eric 的 base reference也是指向p_obj
// 注意sayName代码中的this将指向实例化后的对象(this绑定)
john.sayName(); // john对象本身没有sayName属性, 于是访问原型对象p_obj的sayName属性
eric.sayName(); // 访问同一个原型对象p_obj的sayName属性

var tmp = Person.prototype;
tmp.boss = "David";
// 于这个运行点, p_obj已经被修改
// 根据上述属性访问流程, 新的修改(boss属性)能反映到所有的实例, 包括已经创建和即将创建的
alert("John's boss is " + john.boss);
alert("Eric's boss is " + eric.boss);

// hisCar和sayCar属性将增加到john对象而不是p_obj对象..
john.hisCar = "Audi";
john.sayCar = function(){
    alert(this.name + " has a car of " + this.hisCar);
}
john.sayCar();
// ..因此下一句将错误, 因为eric对象本身和原型p_obj都没有sayName属性
/* eric.sayCar(); */

上一页  1 2 3 4  下一页

Tags:JavaScript 原型 对象

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接