強大的原型和原型鏈

作者 | 湯姆大叔
前言
原型
var decimalDigits = 2,tax = 5;function add(x, y) {return x + y;}function subtract(x, y) {return x - y;}//alert(add(1, 3));
原型使用方式1:
var Calculator = function (decimalDigits, tax) {this.decimalDigits = decimalDigits;this.tax = tax;};
Calculator.prototype = {add: function (x, y) {return x + y;},subtract: function (x, y) {return x - y;}};//alert((new Calculator()).add(1, 3));
原型使用方式2:
Calculator.prototype = function () { } ();Calculator.prototype = function () {add = function (x, y) {return x + y;},subtract = function (x, y) {return x - y;}return {add: add,subtract: subtract}} ();//alert((new Calculator()).add(11, 3));
再來一點
分步聲明:
var BaseCalculator = function () {//為每個實例都聲明一個小數(shù)位數(shù)this.decimalDigits = 2;};//使用原型給BaseCalculator擴展2個對象方法BaseCalculator.prototype.add = function (x, y) {return x + y;};BaseCalculator.prototype.subtract = function (x, y) {return x - y;};
var BaseCalculator = function() {this.decimalDigits = 2;};BaseCalculator.prototype = {add: function(x, y) {return x + y;},subtract: function(x, y) {return x - y;}};
var Calculator = function () {//為每個實例都聲明一個稅收數(shù)字this.tax = 5;};Calculator.prototype = new BaseCalculator();
var calc = new Calculator();alert(calc.add(1, 1));//BaseCalculator 里聲明的decimalDigits屬性,在 Calculator里是可以訪問到的alert(calc.decimalDigits);
var Calculator = function () {this.tax= 5;};Calculator.prototype = BaseCalculator.prototype;
var calc = new Calculator();alert(calc.add(1, 1));alert(calc.decimalDigits);
重寫原型:
//覆蓋前面Calculator的add() functionCalculator.prototype.add = function (x, y) {return x + y + this.tax;};var calc = new Calculator();alert(calc.add(1, 1));
原型鏈
function Foo() {this.value = 42;}Foo.prototype = {method: function() {}};function Bar() {}// 設(shè)置Bar的prototype屬性為Foo的實例對象Bar.prototype = new Foo();Bar.prototype.foo = 'Hello World';// 修正Bar.prototype.constructor為Bar本身Bar.prototype.constructor = Bar;var test = new Bar() // 創(chuàng)建Bar的一個新實例// 原型鏈test [Bar的實例]Bar.prototype [Foo的實例]{ foo: 'Hello World' }Foo.prototype{method: ...};Object.prototype{toString: ... /* etc. */};
屬性查找:
function foo() {this.add = function (x, y) {return x + y;}}foo.prototype.add = function (x, y) {return x + y + 10;}Object.prototype.subtract = function (x, y) {return x - y;}var f = new foo();alert(f.add(1, 2)); //結(jié)果是3,而不是13alert(f.subtract(1, 2)); //結(jié)果是-1
function Foo() {}Foo.prototype = 1; // 無效
hasOwnProperty函數(shù):
// 修改Object.prototypeObject.prototype.bar = 1;var foo = {goo: undefined};foo.bar; // 1'bar' in foo; // truefoo.hasOwnProperty('bar'); // falsefoo.hasOwnProperty('goo'); // true
var foo = {hasOwnProperty: function() {return false;},bar: 'Here be dragons'};foo.hasOwnProperty('bar'); // 總是返回 false// 使用{}對象的 hasOwnProperty,并將其上下為設(shè)置為foo{}.hasOwnProperty.call(foo, 'bar'); // true
// 修改 Object.prototypeObject.prototype.bar = 1;var foo = {moo: 2};for(var i in foo) {console.log(i); // 輸出兩個屬性:bar 和 moo}
// foo 變量是上例中的for(var i in foo) {if (foo.hasOwnProperty(i)) {console.log(i);}}
總結(jié)

評論
圖片
表情
