您好,欢迎访问一九零五行业门户网

JavaScript原型链prototype属性和方法实例详解

prototype 对象的任何属性和方法都被传递给那个类的所有实例。原型链利用这种功能来实现继承机制,如果用原型方式重定义前面例子中的类,它们将变为下列形式:
function classa() { } classa.prototype.color = "blue"; classa.prototype.saycolor = function () { alert(this.color); }; function classb() { } classb.prototype = new classa();
原型方式的神奇之处在于最后一行代码。这里,把 classb 的 prototype 属性设置成 classa 的实例。这很有意思,因为想要 classa 的所有属性和方法,但又不想逐个将它们 添加到classb 的 prototype 属性。还有比把 classa 的实例赋予 prototype 属性更好的方法吗?
注意:调用 classa 的构造函数,没有给它传递参数。这在原型链中是标准做法。要确保构造函数没有任何参数。
与对象冒充相似,子类的所有属性和方法都必须出现在 prototype 属性被赋值后,因为在它之前赋值的所有方法都会被删除。为什么?因为 prototype 属性被替换成了新对象,添加了新方法的原始对象将被销毁。所以,为 classb 类添加 name 属性和 sayname() 方法的代码如下:
function classb() { } classb.prototype = new classa(); classb.prototype.name = ""; classb.prototype.sayname = function () { alert(this.name); };
可通过运行下面的例子测试这段代码:
var obja = new classa(); var objb = new classb(); obja.color = "blue"; objb.color = "red"; objb.name = "john"; obja.saycolor(); objb.saycolor(); objb.sayname();
此外,在原型链中,instanceof 运算符的运行方式也很独特。对 classb 的所有实例,instanceof 为 classa 和 classb 都返回 true。例如:
var objb = new classb(); alert(objb instanceof classa); //输出 "true" alert(objb instanceof classb); //输出 "true"
在 ecmascript 的弱类型世界中,这是极其有用的工具,不过使用对象冒充时不能使用该方法判断。但是由于子类的原型被直接重新赋值,所以出现以下这种情况:
console.log(objb.__proto__===objb.constructor.prototype) //false
因为classb的原型链 prototype 属性被另一个类的对象重写了。输出结果可以看出objb.__proto__仍然指向的是classb.prototype,而不是objb.constructor.prototype。这也很好理解,给person.prototype赋值的是一个对象直接量new classa()实例,使用对象直接量方式定义的对象其构造器(constructor)指向的是根构造器object,object.prototype是一个空对象{},{}自然与classb.prototype不等。
以上就是javascript原型链prototype属性和方法实例详解的详细内容。
其它类似信息

推荐信息