íīëėĪë ęģĩíĩ ėėëĨž ė§ëë ė§ëĻė ëķëĨíęļ° ėí ę°ë
ėīëĪ.
ES5ęđė§ė ėë°ėĪíŽëĶ―íļėë íīëėĪę° ėęģ , ES6ėė íīëėĪę° ëė
ëėëĪ.
íīëėĪë íėëĄ ę°ėëĄ ėė íīëėĪė ėėąė ėėíëĐīė ë ęĩŽėēīė ėļ ėęąīėī ėķę° ëë ëģęē―ëëĪ. (ėė íīëėĪ / íė íīëėĪ)
ííļ, ėļėĪíīėĪë ėīëĪ íīëėĪė ėėąė ė§ëë ėĪėĄīíë ę°ėēī
ëĨž ë§íëĪ.
íëĄę·ļëë° ėļėīėėë íīëėĪę° ëĻžė ė ėëėīėžë§ ę·ļëĄëķí° ęģĩíĩė ėļ ėėëĨž ė§ëë ę°ėēī(ėļėĪíīėĪ)ëĪė ėėąí ė ėëĪ.
var Rectangle = function (name) {
this.width = width;
this.height = height;
};
Rectangle.prototype.getArea = function () {
return this.width * this.height;
};
Rectangle.isRectangle = function (instance) {
return instance instanceOf Rectangle && instance.width > 0 && instance.height > 0;
};
var rect1 = new Rectangle(3, 4);
console.log(rect1.getArea()); // 12
console.log(rect1.isRectangle(rect1)); // Uncaught TypeError: not a function
console.log(Rectangle.isRectangle(rect1)); // true
íëĄí íė
ëĐėëë íīëėĪė prototype ëīëķė ė ėë ëĐėë
ëĄė ėļėĪíīėĪę° ë§ėđ ėė ė ęēėēëž íļėķí ė ėëĪ.
ėĪííą ëĐėëë íīëėĪ(ėėąė íĻė)ė ė§ė ė ėí ëĐėë
ëĄė ėļėĪíīėĪę° ė§ė íļėķí ė ėęģ íīëėĪ(ėėąė íĻė)ė ėíīėë§ íļėķí ė ėëĪ.
ęĩŽėēīė ėļ ėļėĪíīėĪę° ėŽėĐí ëĐėëëĨž ė ėí 'í'ė ėí ė í ëė íīëėĪë ėķėė ėļ ę°ë
ėīëĪ.
ę·ļëŽë, ėĪííą ëĐėëëĨž íļėķí ëė íīëėĪë íīëėĪ(ėėąė íĻė) ėėēīę° thisę° ëėī ëĐėëė ė§ė ė ę·žíëŊëĄ íëė ęĩŽėēīė ėļ ę°ėēīëĄė ė·ĻęļëëĪ.
ëĪėĪ íëĄí íė
ėēīėļ
ė ėīėĐíī íīëėĪ ėėė ęĩŽíí ė ėëĪ.
ėë°ėĪíŽëĶ―íļėė íīëėĪ ėėė ęĩŽííëĪë ęēė ęģ§ íëĄí íė
ėēīėīëė ė ė°ęē°íëĪë ëŧėīëĪ.
ėė ė°ļęģ íë ėė ëĨž ëĪė ę°ė ļėëĪ.
ėė 1: Array ëīėĨ íīëėĪëĨž ėėíë íė íīëėĪ
var Grade = function () {
var args = Array.prototype.slice.call(arguments);
for (var i = 0; i < args.length; i++) {
this[i] = args[i];
}
this.length = args.length;
};
Grade.prototype = [];
var g = new Grade(100, 80);
console.log(g); // // Grade { 0: 100, 1: 80, length: 2 }
delete g.length; // gėė length íëĄíží°ę° ėė ëëĪ
g.push(70); // gė length ę°ėžëĄ g.__proto__.length(ėĶ, Grade.prototype.length)ė ę°(0)ė ė―ėīėĻ í gė 70ė push íëĪ
console.log(g); // Grade { 0: 70, 1: 80, length: 1 }
ę·ļëŽë ė ėė ė―ëėë ëŠ ę°ė§ í° ëŽļė ę° ėëĪ.
ëīėĨ ę°ėēīėļ ë°°ėī ėļėĪíīėĪė length íëĄíží°ë ėė ę° ëķę°ëĨí ë°ëĐī, Grade íīëėĪė ėļėĪíīėĪë Grade.prototype = []
ė ėíī ë°°ėī ëĐėëëĨž ėėíëĐīėë, ęļ°ëģļė ėžëĄë ėžë° ę°ėēīė ėąė§ė ę·ļëëĄ ė§ëëŊëĄ length íëĄíží°ëĨž ėė í ė ėëĪ.
ėīė ę°ė ėĪëĨëĨž ė íė§ ėęļ° ėíīėë íīëėĪė ėë ę°ėī ėļėĪíīėĪė ëėė ėíĨė ėĢžė§ ėęēë íīëėĪę° ęĩŽėēīė ėļ ë°ėīí°ëĨž ė§ëė§ ėëëĄ íīėž íëĪ.
ėė 2: ėŽėĐėę° ė ėí ë íīëėĪ ėŽėīė ėė ęīęģ
// ė§ėŽę°í íīëėĪ & ė ėŽę°í íīëėĪ
var Rectangle = function (width, height) {
this.width = width;
this.height = height;
};
Rectangle.prototype.getArea = function () {
return this.width * this.height;
};
var rect = new Rectangle(3, 4);
console.log(rect.getArea()); // 12
var Square = function (width) {
Rectangle.call(this, width, width);
};
Square.prototype = new Rectangle(); // íė íīëėĪė prototypeė ė°ęē°íęģ ė íë ėė íīëėĪ(ėėąė íĻė)ė ėļėĪíīėĪ í ëđ
var sq = new Square(5);
console.log(sq.getArea()); // 25
console.dir(sq)
ė ėĪííī sq ėļėĪíīėĪëĨž ėīíīëģīëĐī íīëėĪę° ęĩŽėēīė ėļ ë°ėīí°ëĨž ę°ė§ęģ ėėė íėļí ė ėëĪ.
Square
height: 5
width: 5
__proto__: Rectangle // íīëėĪę°
height: undefined // undefined ëžë ę°ė ę°ė§ëĪ
width: undefined // undefined ëžë ę°ė ę°ė§ëĪ
__proto__ :
getArea: f ()
constructor: f (width, height)
__proto__: Object
ëí, sq ėļėĪíīėĪė constructorę° Squareę° ėëëž Rectangleė ė°ļėĄ°íëĪë ëŽļė ė ė ę°ė§ëĪ.
var rect2 = sq.constructor(2, 3);
console.log(rect2); // Rectangle { width: 2, height: 3 }
ė ëĶŽíėëĐī, íė íīëėĪëĄ ėžė ėėąė íĻėė prototypeė ėė íīëėĪė ėļėĪíīėĪëĨž ëķėŽíĻėžëĄėĻ(ëĪėĪ íëĄí íė ėēīėļ) ęļ°ëģļė ėļ ëĐėë ėėė ę°ëĨíė§ë§ ëĪėí ëŽļė ę° ë°ėí ėŽė§ę° ėëĪęģ í ė ėëĪ.
íīëėĪ ėė ë° ėķėíëĨž ėíīėë
SubClass.prototype.__proto__
ę°SuperClass.prototype
ė ė°ļėĄ°íęģ ,SubClass.prototype
ėë ëķíėí ėļėĪíīėĪ íëĄíží°(ęĩŽėēīė ėļ ë°ėīí°)ę° ëĻė§ ėëëĄ íīėž íëĪ.
ë°Đëē 1: ėļėĪíīėĪ ėėą í íëĄíží° ė ęą°
ėė íīëėĪė ėļėĪíīėĪ(íė íīëėĪė prototype ę°ėēī)ëĨž ë§ë í íė íīëėĪę° ęĩŽėēīė ėļ ë°ėīí°ëĨž ė§ëė§ ėëëĄ ę·ļ íëĄíží°ëĨž ė ęą°íëĪ.
ėīíëĄ ëģęē― íđė ėė í ė ėëëĄ Object.freeze()ëĨž ėŽėĐíëĪ.
delete Square.prototype.width;
delete Square.prototype.height;
Object.freeze(Square.prototype);
ë°Đëē 2: ëđ íĻė íėĐ
var Bridge = function () {}; // ëđ ėėąė íĻė
Bridge.prototype = Rectangle.prototype;
Square.prototype = new Bridge();
Object.freeze(Square.prototype);
ë°Đëē 3: Object.create() íėĐ
íė íīëėĪė prototypeė __proto__
ę°, ėė íīëėĪė prototypeė ė°ļėĄ°íë, (íė íīëėĪę° ęĩŽėēīė ėļ ë°ėīí°ëĨž ė§ëė§ ėëëĄ) ėė íīëėĪė ėļėĪíīėĪę° ëė§ë ėëëĄ íëĪ.
...
Square.prototype = Object.create(Rectangle.prototype);
Object.freeze(Square.prototype);
...
ėėė ėīíīëīĪëŊėī SubClass.prototype.constructorę° SuperClassëĨž ę°ė§ęģ ėėīė SubClass.constructorëĨž ėĪííëĐī ėëė ëĪëĨļ ęē°ęģžę° ëėĻëĪ.
íīëėĪ ėė ë° ėķėíëĨž ėíī ėķę°ė ėžëĄ SubClass.prototype.constructorę° SubClassëĨž ė°ļėĄ°íëëĄ íīėž íëĪ.
ëēėĐėąė ęģ ë Īí ė―ëė ėë ė―ëëĨž ėķę°íëëĄ íëĪ.
SubClass.prototype.constructor = SubClass;
var Rectangle = class {
constructor (width, height) {
this.width = width;
this.height = height;
}
getArea () {
return this.width * this.height
}
};
var Square = class extends Rectangle {
constructor (width) {
super(width, width);
}
getArea () {
console.log("size is : ", super.getArea());
}
};
ėė íīëėĪëĨž ėėë°ë íė íīëėĪëĨž ë§ëĪęļ° ėíī class ëŠ
ë đėī ëĪė 'extends ėė íīëėĪ ėīëĶ'
ė ėķę°íëĪ.
constructor ëĐėë ëīëķ
ėė super íĪėëëĨž 'íĻė'ėēëž ėŽėĐí ė ėëë°, ėīë ėė íīëėĪė constructor(ėėąė íĻė)ëĨž ėĪííëĪ.
constructor ëĐėëëĨž ė ėļí ëĪëĨļ ëĐėë
ėėë super íĪėëëĨž 'ę°ėēī'ėēëž ėŽėĐí ė ėëĪ.
ėīë ę°ėēīë ėė íīëėĪė prototype ę°ėēīëĨž ė°ļėĄ°íëĪ.
ę·ļëŽë, íļėķí ëĐėë ëīëķėėė thisë ėëė this(ėĶ, íė íīëėĪė prototype ę°ėēī)ëĨž ę·ļëëĄ ë°ëĨļëĪ.