ECMAScript ਵਿਰਾਸਤੀ ਤੰਤਰ ਇਮਪਲੀਮੈਂਟੇਸ਼ਨ
- ਪਿੰਡਾ ਪੰਨਾ ਵਿਰਾਸਤੀ ਮਕੈਨਿਜ਼ਮ ਉਦਾਹਰਣ
- ਅਗਲਾ ਪੰਨਾ JavaScript ਉੱਚ ਸਿੱਖਿਆ
ਵਿਰਾਸਤ ਵਿਵਸਥਾ ਲਾਗੂ ਕਰਨ ਦਾ ਵਿਸ਼ੇਸ਼ਣ
ECMAScript ਵਿੱਚ ਵਿਰਾਸਤ ਵਿਵਸਥਾ ਲਾਗੂ ਕਰਨ ਲਈ ਤੁਸੀਂ ਵਿਰਾਸਤ ਕਰਨ ਵਾਲੇ ਮੂਲ ਵਰਗ ਤੋਂ ਸ਼ੁਰੂ ਕਰ ਸਕਦੇ ਹੋ।ਸਾਰੇ ਵਿਕਾਸਕਾਰ ਦਵਿੰਦੇ ਵਰਗ ਸਾਰੇ ਵਰਗ ਮੂਲ ਵਰਗ ਵਜੋਂ ਕਾਰਜ ਕਰ ਸਕਦੇ ਹਨ।ਸੁਰੱਖਿਆ ਕਾਰਣਾਂ ਕਰਕੇ ਸਥਾਨਕ ਵਰਗ ਅਤੇ ਮੂਲ ਵਰਗ ਨੂੰ ਮੂਲ ਵਰਗ ਵਜੋਂ ਨਹੀਂ ਕਰਨਾ ਚਾਹੀਦਾ ਕਿਉਂਕਿ ਇਹ ਕੰਮ ਸਥਾਨਕ ਬਰਾਉਜ਼ਰ ਦੇ ਲਈ ਕੰਪਾਈਲਡ ਕੋਡ ਦੀ ਪ੍ਰਯੋਗ ਦੀ ਸੁਰੱਖਿਆ ਨੂੰ ਬੁਝਾਉਂਦਾ ਹੈ ਜਿਸ ਦੀ ਦੁਰਵਿਵਹਾਰ ਹੋ ਸਕਦੀ ਹੈ。
ਮੂਲ ਵਰਗ ਚੁਣਨ ਤੋਂ ਬਾਅਦ ਉਸ ਦੇ ਉਪ ਵਰਗ ਬਣਾਉਣ ਦਾ ਅਧਿਕਾਰ ਤੁਹਾਡੇ ਹੈ।ਕਿਉਂਕਿ ਮੂਲ ਵਰਗ ਦੀ ਵਰਤੋਂ ਪੂਰੀ ਤਰ੍ਹਾਂ ਤੁਹਾਡੇ ਨਿਰਣਾਇਕ ਹੈ।ਕਦੇ ਕਦੇ ਤੁਸੀਂ ਇੱਕ ਅਜਿਹਾ ਮੂਲ ਵਰਗ ਬਣਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ ਜਿਸ ਨੂੰ ਸਿੱਧੇ ਵਰਤਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੋਵੇ ਪਰ ਜੋ ਉਪ ਵਰਗ ਨੂੰ ਆਮ ਫੰਕਸ਼ਨ ਪ੍ਰਦਾਨ ਕਰੇ।ਇਸ ਪ੍ਰਕਾਰ ਦੇ ਮੂਲ ਵਰਗ ਨੂੰ ਅਬਸਟ੍ਰੈਕਟ ਵਰਗ ਮੰਨਿਆ ਜਾਂਦਾ ਹੈ。
ਇਹ ਪ੍ਰਕਾਰ ਹੈ ਕਿ ECMAScript ਹੋਰ ਭਾਸ਼ਾਵਾਂ ਜਿਹਾਂ ਨਹੀਂ ਸਖਤ ਤੌਰ 'ਤੇ ਅਬਸਟ੍ਰੈਕਟ ਵਰਗ ਨਾਲ ਨਿਰਧਾਰਿਤ ਕਰਦਾ ਹੈ ਪਰ ਕਦੇ ਕਦੇ ਇਸ ਨੇ ਕੁਝ ਅਜਿਹੇ ਵਰਗ ਬਣਾਏ ਹਨ ਜਿਨ੍ਹਾਂ ਨੂੰ ਵਰਤਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।ਆਮ ਤੌਰ 'ਤੇ ਇਸ ਤਰ੍ਹਾਂ ਦੇ ਵਰਗ ਨੂੰ ਅਬਸਟ੍ਰੈਕਟ ਵਰਗ ਕਿਹਾ ਜਾਂਦਾ ਹੈ。
ਬਣਾਈਆਂ ਹੋਈਆਂ ਉਪ ਵਰਗਾਂ ਨੂੰ ਮੂਲ ਵਰਗ ਦੇ ਸਾਰੇ ਗੁਣ ਅਤੇ ਮੈਥਡ ਪਰਿਵਾਰ ਕਰਦੇ ਹਨ ਜਿਸ ਵਿੱਚ ਬਣਾਉਣ ਵਾਲਾ ਮੈਥਡ ਵੀ ਸ਼ਾਮਿਲ ਹੈ।ਯਾਦ ਰੱਖੋ ਕਿ ਸਾਰੇ ਗੁਣ ਅਤੇ ਮੈਥਡ ਸਾਰਵਜਨਿਕ ਹਨ ਇਸ ਲਈ ਉਪ ਵਰਗ ਨੂੰ ਇਨ੍ਹਾਂ ਮੈਥਡਾਂ ਨੂੰ ਸਿੱਧੇ ਪਹੁੰਚਾਉਣਾ ਹੈ।ਉਪ ਵਰਗ ਨੂੰ ਮੂਲ ਵਰਗ ਵਿੱਚ ਨਾ ਹੋਣ ਵਾਲੇ ਨਵੇਂ ਗੁਣ ਅਤੇ ਮੈਥਡ ਜੋੜ ਸਕਦੇ ਹਨ ਜਾਂ ਮੂਲ ਵਰਗ ਦੇ ਗੁਣ ਅਤੇ ਮੈਥਡ ਨੂੰ ਓਵਰਰਾਈਡ ਕਰ ਸਕਦੇ ਹਨ。
继承的方式
和其他功能一样,ECMAScript 实现继承的方式不止一种。这是因为 JavaScript 中的继承机制并不是明确规定的,而是通过模仿实现的。这意味着所有的继承细节并非完全由解释程序处理。作为开发者,你有权决定最适用的继承方式。
下面为您介绍几种具体的继承方式。
对象冒充
构想原始的 ECMAScript 时,根本没打算设计对象冒充(object masquerading)。它是在开发者开始理解函数的工作方式,尤其是如何在函数环境中使用 this 关键字后才发展出来。
其原理如下:构造函数使用 this 关键字给所有属性和方法赋值(即采用类声明的构造函数方式)。因为构造函数只是一个函数,所以可使 ClassA 构造函数成为 ClassB 的方法,然后调用它。ClassB 就会收到 ClassA 的构造函数中定义的属性和方法。例如,用下面的方式定义 ClassA 和 ClassB:
function ClassA(sColor) { this.color = sColor; this.sayColor = function () { alert(this.color); }; } function ClassB(sColor) { }
ਯਾਦ ਕਰੋ ਕਿ? ਕੀਵਾਰਡ this ਕੰਸਟਰਕਟਰ ਵਰਤੇ ਜਾਣ ਵਾਲੇ ਆਬਜੈਕਟ ਨੂੰ ਦਿੰਦਾ ਹੈ। ਲੇਕਿਨ ਇਸ ਮੈਥਾਡ ਵਿੱਚ, this ਦਾ ਦਿਸ਼ਾਨਿਰਦੇਸ਼ ਇਸ ਦੇ ਮਾਲਕ ਆਬਜੈਕਟ ਨੂੰ ਦਿੰਦਾ ਹੈ। ਇਹ ਸਿਧਾਂਤ ਇਹ ਹੈ ਕਿ ClassA ਨੂੰ ਇੱਕ ਰੈਗੂਲਰ ਫੰਕਸ਼ਨ ਵਜੋਂ ਬਣਾਇਆ ਗਿਆ ਹੈ ਤਾਂ ਹੀ ਇਸ ਨੂੰ ਇਨਹੈਰਿਟੈਂਸ ਮੈਕੈਨਿਜਮ ਵਜੋਂ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ, ਨਹੀਂ ਤਾਂ ਕਿ ਇੱਕ ਕੰਸਟਰਕਟਰ ਵਜੋਂ। ਹੇਠ ਲਿਖੇ ਤਰੀਕੇ ਨਾਲ ਕੰਸਟਰਕਟਰ ClassB ਨੂੰ ਇਨਹੈਰਿਟੈਂਸ ਮੈਕੈਨਿਜਮ ਵਜੋਂ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ:
function ClassB(sColor) { this.newMethod = ClassA; this.newMethod(sColor); delete this.newMethod; }
ਇਸ ਕੋਡ ਵਿੱਚ, ਕਲਾਸ ਏ ਨੂੰ ਨਵੇਂ ਮੈਥਾਡ ਨਵੇਂ ਮੈਥਾਡ (ਯਾਨੀ, ਫੰਕਸ਼ਨ ਨੂੰ ਇਕ ਪੁਨਰ ਸੰਕੇਤ ਦੇਣਾ) ਦੇ ਰੂਪ ਵਿੱਚ ਦਿੱਤਾ ਗਿਆ ਹੈ (ਯਾਨੀ, ਫੰਕਸ਼ਨ ਦਾ ਨਾਮ ਉਸ ਦੇ ਪੁਨਰ ਸੰਕੇਤ ਨੂੰ ਦਿੰਦਾ ਹੈ)। ਫਿਰ ਇਸ ਮੈਥਾਡ ਨੂੰ ਚਲਾਇਆ ਗਿਆ ਹੈ, ਜਿਸ ਵਿੱਚ ਕਲਾਸ ਬੀ ਦੇ ਕੰਸਟਰਕਟਰ ਦੇ ਪੈਰਾਮੀਟਰ sColor ਦਿੱਤੇ ਗਏ ਹਨ। ਆਖਰੀ ਕੋਡ ਵਿੱਚ ਕਲਾਸ ਏ ਦੀ ਪੁਨਰ ਸੰਕੇਤ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ, ਤਾਂ ਹੁਣ ਇਸ ਨੂੰ ਕਿਸੇ ਹੋਰ ਪੁਨਰ ਸੰਕੇਤ ਦੇ ਰੂਪ ਵਿੱਚ ਕਿਸੇ ਹੋਰ ਥਾਂ ਦੇ ਰੂਪ ਵਿੱਚ ਵਰਤਿਆ ਜਾ ਸਕੇ ਨਹੀਂ ਹੈ。
ਸਾਰੇ ਨਵੇਂ ਪੈਰਾਮੀਟਰ ਅਤੇ ਮੈਥਾਡ ਨੂੰ ਨਵੇਂ ਮੈਥਾਡ ਦੇ ਕੋਡ ਰਿਮੂਵ ਕਰਨ ਤੋਂ ਬਾਅਦ ਪਰਿਭਾਸ਼ਿਤ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ। ਨਹੀਂ ਤਾਂ ਸੰਭਵ ਹੈ ਕਿ ਉੱਚ ਵਰਗ ਦੇ ਸਬੰਧਤ ਪੈਰਾਮੀਟਰ ਅਤੇ ਮੈਥਾਡ ਨੂੰ ਓਵਰਰਾਇਡ ਕੀਤਾ ਜਾ ਸਕੇ:
function ClassB(sColor, sName) { this.newMethod = ClassA; this.newMethod(sColor); delete this.newMethod; this.name = sName; this.sayName = function () { alert(this.name); }; }
ਇਸ ਤੋਂ ਪਹਿਲਾਂ ਦੇ ਕੋਡ ਦੀ ਪ੍ਰਮਾਣਿਕਤਾ ਦੇ ਪ੍ਰਮਾਣ ਲਈ ਹੇਠ ਲਿਖੇ ਉਦਾਹਰਣ ਨੂੰ ਚਲਾਓ:
var objA = new ClassA("blue"); var objB = new ClassB("red", "John"); objA.sayColor(); //ਬਿਆਨ "blue" objB.sayColor(); //ਬਿਆਨ "red" objB.sayName(); // ਆਉਟਪੁਟ "John"
ਆਬਜੈਕਟ ਮਾਸਕਿਰੇਡਿੰਗ ਨਾਲ ਬਹੁਪੱਖੀ ਇਨਹੈਰਿਟੈਂਸ ਹੋ ਸਕਦਾ ਹੈ
ਇੱਕ ਹੋਰ ਮਹਾਨ ਗੱਲ ਹੈ ਕਿ ਆਬਜੈਕਟ ਮਾਸਕਿਰੇਡਿੰਗ ਦੁਵਾਰਾ ਬਹੁਪੱਖੀ ਇਨਹੈਰਿਟੈਂਸ ਸਮਰਥਿਤ ਹੈ। ਯਾਨੀ ਇੱਕ ਵਰਗ ਕਈ ਉੱਚ ਵਰਗਾਂ ਨੂੰ ਇਨਹੈਰਿਟ ਕਰ ਸਕਦਾ ਹੈ। ਬਹੁਪੱਖੀ ਇਨਹੈਰਿਟੈਂਸ ਦੀ ਯੂਐੱਮਐੱਲ ਪ੍ਰਦਰਸ਼ਨ ਹੇਠ ਦਿੱਤੀ ਹੈ:

ਜੇਕਰ ਦੋ ਵਰਗ ਕਲਾਸ ਐਕਸ ਅਤੇ ਕਲਾਸ ਵਾਈ ਹਨ, ਤਾਂ ਕਲਾਸ ਜ਼ੀ ਇਨ੍ਹਾਂ ਦੋਵਾਂ ਵਰਗਾਂ ਨੂੰ ਇਨਹੈਰਿਟ ਕਰਨਾ ਚਾਹੁੰਦੀ ਹੈ, ਤਾਂ ਹੇਠ ਲਿਖੇ ਕੋਡ ਨੂੰ ਵਰਤ ਸਕਦੀ ਹੈ:
function ClassZ() { this.newMethod = ClassX; this.newMethod(); delete this.newMethod; this.newMethod = ClassY; this.newMethod(); delete this.newMethod; }
ਇਸ ਵਿੱਚ ਇੱਕ ਕਮੀ ਹੈ ਜੇਕਰ ਦੋ ਵਰਗ ClassX ਅਤੇ ClassY ਨੂੰ ਇੱਕ ਜਿਹੇ ਨਾਮ ਦੀਆਂ ਪ੍ਰਤੀਯੋਗਿਤਾਵਾਂ ਜਾਂ ਮੈਥਡ ਹੋਣਗੇ ਤਾਂ ClassY ਦੀ ਪ੍ਰਾਥਮਿਕਤਾ ਹੋਵੇਗੀ ਕਿਉਂਕਿ ਉਹ ਪਿੰਡੀ ਵਰਗ ਤੋਂ ਲਿਆ ਗਿਆ ਹੈ। ਇਸ ਸਮੱਸਿਆ ਤੋਂ ਇਲਾਵਾ ਆਬਾਦੀ ਨਾਲ ਬਦਲਣ ਰਾਹੀਂ ਬਹੁਪੱਖੀ ਇਨਹੈਰਿਟੈਂਸ ਮੈਥਡ ਵਰਤਣਾ ਅਸਾਨ ਹੈ。
ਇਸ ਇਨਹੈਰਿਟੈਂਸ ਮੈਥਡ ਦੀ ਪ੍ਰਚਲਿਤਤਾ ਦੇ ਕਾਰਨ ECMAScript ਦੀ ਤੀਜੀ ਸੰਸਕਰਣ ਵਿੱਚ Function ਆਬਾਦੀ ਨੂੰ ਦੋ ਨਵੇਂ ਮੈਥਡ ਜੋਡਿਆ ਗਏ ਹਨ ਜਿਵੇਂ call() ਅਤੇ apply()。
call() ਮੈਥਡ
call() ਮੈਥਡ call() ਮੈਥਡ ਨਾਲ ਸਭ ਤੋਂ ਨੇੜੇ ਹੈ ਜੋ ਕਿ ਕਲਾਸਿਕ ਆਬਾਦੀ ਨਾਲ ਬਦਲਣ ਦੀ ਪ੍ਰਕਿਰਿਆ ਨਾਲ ਮੇਲ ਖਾਂਦਾ ਹੈ। ਇਸ ਦੇ ਪਹਿਲੇ ਪੈਰਾਮੀਟਰ ਨੂੰ this ਦੇ ਆਪਣੇ ਆਬਾਦੀ ਨੂੰ ਕਾਰਜ ਕਰਦਾ ਹੈ। ਹੋਰ ਪੈਰਾਮੀਟਰ ਸਿੱਧੇ ਫੰਕਸ਼ਨ ਨੂੰ ਪਾਸ ਕੀਤੇ ਜਾਂਦੇ ਹਨ। ਉਦਾਹਰਣ ਵਜੋਂ:
function sayColor(sPrefix,sSuffix) { alert(sPrefix + this.color + sSuffix); }; var obj = new Object(); obj.color = "blue"; sayColor.call(obj, "The color is ", "a very nice color indeed.");
ਇਸ ਉਦਾਹਰਣ ਵਿੱਚ ਫੰਕਸ਼ਨ sayColor() ਆਬਾਦੀ ਬਾਹਰ ਪਰਿਭਾਸ਼ਿਤ ਕੀਤਾ ਗਿਆ ਹੈ ਚਾਹੇ ਉਹ ਕੋਈ ਆਬਾਦੀ ਨਾ ਹੋਵੇ ਇਸ ਲਈ ਇਹ ਕੀਵਰਡ this ਨੂੰ ਆਬਾਦੀ ਵਿੱਚ ਪਹਿਲਾਂ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦਾ ਹੈ। ਆਬਾਦੀ obj ਦੀ color ਪ੍ਰਤੀਯੋਗਿਤਾ blue ਹੈ। call() ਮੈਥਡ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ ਪਹਿਲਾ ਪੈਰਾਮੀਟਰ obj ਹੈ ਜਿਸ ਨਾਲ ਕਹਾਣਾ ਹੈ ਕਿ sayColor() ਫੰਕਸ਼ਨ ਵਿੱਚ this ਕੀਵਰਡ ਦੀ ਕੀਮਤ obj ਹੈ। ਦੂਜੀ ਅਤੇ ਤੀਜੀ ਪੈਰਾਮੀਟਰ ਚਿੰਨ੍ਹਾਂ ਹਨ ਜੋ sayColor() ਫੰਕਸ਼ਨ ਵਿੱਚ sPrefix ਅਤੇ sSuffix ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਹਨ। ਅੰਤਿਮ ਸੰਦੇਸ਼ "The color is blue, a very nice color indeed." ਦਿਖਾਇਆ ਜਾਵੇਗਾ。
ਇਸ ਮੈਥਡ ਨੂੰ ਵਾਲਿਡੇਟਿਵ ਇਨਹੈਰਿਟੈਂਸ ਮੈਥਡ ਨਾਲ ਵਰਤਣ ਲਈ ਸਿਰਫ਼ ਤਿੰਨ ਪਰਿਭਾਸ਼ਾਵਾਂ ਦੀ ਨਸ਼ਟ ਕਰਨ ਵਾਲੀ ਕੋਡ ਨੂੰ ਬਦਲ ਦੇਣਾ ਚਾਹੀਦਾ ਹੈ:
function ClassB(sColor, sName) { //this.newMethod = ClassA; //this.newMethod(color); //delete this.newMethod; ClassA.call(this, sColor); this.name = sName; this.sayName = function () { alert(this.name); }; }
ਇੱਥੇ ਅਸੀਂ ClassA ਵਿੱਚ ਦਿਸ਼ਾ ਵਾਲੇ ਕੀਵਰਡ this ਨੂੰ ਨਵੇਂ ਬਣਾਏ ਗਏ ClassB ਆਬਾਦੀ ਨਾਲ ਬਣਾਉਣਾ ਚਾਹੁੰਦੇ ਹਾਂ ਇਸ ਲਈ this ਪਹਿਲਾ ਪੈਰਾਮੀਟਰ ਹੈ। ਦੂਜਾ ਪੈਰਾਮੀਟਰ sColor ਦੋਵੇਂ ਵਰਗਾਂ ਲਈ ਇੱਕੋ ਜਿਹਾ ਹੈ।
apply() ਮੈਥਡ
apply() ਮੈਥਡ ਦੋ ਪੈਰਾਮੀਟਰ ਹੁੰਦੇ ਹਨ، ਜੋ this ਦੇ ਆਪਣੇ ਆਬਾਦੀ ਨੂੰ ਅਤੇ ਫੰਕਸ਼ਨ ਨੂੰ ਪਾਸ ਕਰਨ ਵਾਲੇ ਪੈਰਾਮੀਟਰਾਂ ਦੇ ਸਮੂਹ ਨੂੰ ਕਾਰਜ ਕਰਦੇ ਹਨ। ਉਦਾਹਰਣ ਵਜੋਂ:
function sayColor(sPrefix,sSuffix) { alert(sPrefix + this.color + sSuffix); }; var obj = new Object(); obj.color = "blue"; sayColor.apply(obj, new Array("The color is ", "a very nice color indeed."));
这个例子与前面的例子相同,只是现在调用的是 apply() 方法。调用 apply() 方法时,第一个参数仍是 obj,说明应该赋予 sayColor() 函数中的 this 关键字值是 obj。第二个参数是由两个字符串构成的数组,与 sayColor() 函数中的参数 sPrefix 和 sSuffix 匹配,最后生成的消息仍是 "The color is blue, a very nice color indeed.",将被显示出来。
该方法也用于替换前三行的赋值、调用和删除新方法的代码:
function ClassB(sColor, sName) { //this.newMethod = ClassA; //this.newMethod(color); //delete this.newMethod; ClassA.apply(this, new Array(sColor)); this.name = sName; this.sayName = function () { alert(this.name); }; }
同样的,第一个参数仍是 this,第二个参数是只有一个值 color 的数组。可以把 ClassB 的整个 arguments 对象作为第二个参数传递给 apply() 方法:
function ClassB(sColor, sName) { //this.newMethod = ClassA; //this.newMethod(color); //delete this.newMethod; ClassA.apply(this, arguments); this.name = sName; this.sayName = function () { alert(this.name); }; }
当然,只有超类中的参数顺序与子类中的参数顺序完全一致时才可以传递参数对象。如果不是,就必须创建一个单独的数组,按照正确的顺序放置参数。此外,还可使用 call() 方法。
原型链(prototype chaining)
继承这种形式在 ECMAScript 中原本是用于原型链的。上一章介绍了定义类的原型方式。原型链扩展了这种方式,以一种有趣的方式实现继承机制。
在上一章学过,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 ਪ੍ਰਪਤੀ ਦੇ ਅਨੁਸਾਰ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ, ਕਿਉਂਕਿ ਇਸ ਤੋਂ ਪਹਿਲਾਂ ਵਰਤਿਆ ਜਾਣ ਵਾਲਾ ਪ੍ਰਕਿਰਿਆ ਅਤੇ ਪ੍ਰਪਤੀਆਂ ਹਟਾਈਆਂ ਜਾਣਗੀਆਂ। ਕਿਉਂ? ਕਿਉਂਕਿ 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 ਆਪਰੇਟਰ ਦਾ ਕੰਮ ਕਰਨ ਦਾ ਤਰੀਕਾ ਵੀ ਅਲੱਗ ਹੈ। ਕਲਾਸਬੀ ਦੇ ਸਾਰੇ ਇੰਸਟੈਂਸ ਲਈ instanceof ਕਲਾਸਏ ਅਤੇ ਕਲਾਸਬੀ ਦੋਵੇਂ ਲਈ true ਵਾਪਸ ਦਿੰਦਾ ਹੈ। ਉਦਾਹਰਣ ਵਜੋਂ:
var objB = new ClassB(); alert(objB instanceof ClassA); //ਆਉਟਪੁਟ "true" alert(objB instanceof ClassB); //ਆਉਟਪੁਟ "true"
ਈਸਕ੍ਰਿਪਟ ਦੇ ਨਿਊਕਲੀਅਰ ਟਾਈਪ ਵਿੱਚ, ਇਹ ਬਹੁਤ ਮਹੱਤਵਪੂਰਨ ਉਪਕਰਣ ਹੈ, ਪਰ ਆਬਜ਼ਦਗੀ ਦੇ ਵਰਤੋਂ ਵਿੱਚ ਇਸ ਨੂੰ ਨਹੀਂ ਵਰਤਿਆ ਜਾ ਸਕਦਾ।
ਪ੍ਰੋਟੋਟਾਈਪ ਲੜੀ ਦਾ ਨਾਹੀਂ ਹੈ ਕਿ ਬਹੁਵਿਰਾਸਤੀ ਨਹੀਂ ਸਮਰਥਿਤ ਹੈ। ਯਾਦ ਰੱਖੋ, ਪ੍ਰੋਟੋਟਾਈਪ ਲੜੀ ਦੀ ਪ੍ਰੋਪੀਟੀ ਦੀ ਜਗ੍ਹਾ ਹੋਰ ਪ੍ਰਕਾਰ ਦੇ ਆਬਜ਼ਦਗੀ ਨਾਲ ਲਿਖ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ।
ਮਿਕਸਡ ਮੇਥਡ
ਇਹ ਵਿਰਾਸਤੀ ਤਰੀਕਾ ਕਲਾਸ ਨਾਲ ਬਣਾਉਣ ਲਈ ਕੰਸਟਰਕਟਰ ਫੰਕਸ਼ਨ ਵਰਤਦਾ ਹੈ, ਨਾ ਕਿ ਕੋਈ ਵੀ ਪ੍ਰੋਟੋਟਾਈਪ। ਆਬਜ਼ਦਗੀ ਨਾਲ ਪ੍ਰਮੁੱਖ ਪ੍ਰਸ਼ਨ ਹੈ ਕਿ ਉਹ ਕੰਸਟਰਕਟਰ ਫੰਕਸ਼ਨ ਵਰਤਣਾ ਹੈ, ਇਹ ਸਭ ਤੋਂ ਚੰਗਾ ਚੈਨਸ ਨਹੀਂ ਹੈ। ਪਰ ਜੇਕਰ ਪ੍ਰੋਟੋਟਾਈਪ ਲੜੀ ਵਰਤੀ ਜਾਂਦੀ ਹੈ, ਤਾਂ ਪੈਰਾਮੀਟਰਸ ਨਾਲ ਕੰਸਟਰਕਟਰ ਨਹੀਂ ਵਰਤਿਆ ਜਾ ਸਕਦਾ। ਡਿਵੈਲਪਰ ਕਿਵੇਂ ਚੁਣਣਾ ਹੈ? ਜਵਾਬ ਸਰਲ ਹੈ, ਦੋਵੇਂ ਦਾ ਵਰਤੋਂ ਕਰੋ।
ਪਿਛਲੇ ਅਧਿਆਏ ਵਿੱਚ, ਅਸੀਂ ਸਰਬਸਰੇਸ਼ਠ ਤਰੀਕੇ ਨਾਲ ਕਲਾਸ ਬਣਾਉਣ ਦੀ ਵਿਧੀ ਵਿੱਚ ਕੰਸਟਰਕਟਰ ਵਿੱਚ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਨਿਰਮਿਤ ਕਰਨ ਅਤੇ ਪ੍ਰੋਟੋਟਾਈਪ ਵਿੱਚ ਤਰੀਕੇ ਨੂੰ ਵਰਤਿਆ ਗਿਆ ਹੈ। ਇਹ ਤਰੀਕਾ ਵਿਰਾਸਤੀ ਮਕੈਨਿਜ਼ਮ ਵਿੱਚ ਵੀ ਲਾਗੂ ਹੁੰਦਾ ਹੈ, ਵਿਰਾਸਤੀ ਕੰਸਟਰਕਟਰ ਦੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਅਧਿਕਾਰ ਕਰਨ ਲਈ ਅਧਿਕਾਰ ਵਰਤੋਂ ਕਰਨ ਅਤੇ ਪ੍ਰੋਟੋਟਾਈਪ ਵਰਤੋਂ ਕਰਨ ਲਈ ਪ੍ਰੋਟੋਟਾਈਪ ਲਾਈਨ ਵਰਤਨ ਕਰਨ ਦੀ ਵਿਧੀ ਨਾਲ ਇਸ ਉਦਾਹਰਣ ਨੂੰ ਮੁੜ ਲਿਖਿਆ ਗਿਆ ਹੈ, ਕੋਡ ਇਸ ਤਰ੍ਹਾਂ ਹੈ: }}
function ClassA(sColor) { this.color = sColor; } ClassA.prototype.sayColor = function () { alert(this.color); }; function ClassB(sColor, sName) { ClassA.call(this, sColor); this.name = sName; } ClassB.prototype = new ClassA(); ClassB.prototype.sayName = function () { alert(this.name); };
ਇਸ ਉਦਾਹਰਣ ਵਿੱਚ ਵਿਰਾਸਤੀ ਮਕੈਨਿਜ਼ਮ ਦੋ ਲਾਲੇ ਸ਼ਾਬਦੀਆਂ ਦੇ ਰੂਪ ਵਿੱਚ ਲਾਗੂ ਕੀਤਾ ਗਿਆ ਹੈ। ਪਹਿਲੇ ਲਾਲੇ ਸ਼ਾਬਦੀ ਵਿੱਚ ਵਿਰਾਸਤੀ ਕਲਾਸ ClassA ਦੇ sColor ਅਤੀਤ ਨੂੰ ਅਧਿਕਾਰ ਕਰਨ ਲਈ ClassB ਦੇ ਕੰਸਟਰਕਟਰ ਵਿੱਚ ਆਪਣੇ ਆਪ ਦਾ ਵਰਤੋਂ ਕੀਤਾ ਗਿਆ ਹੈ। ਦੂਜੇ ਲਾਲੇ ਸ਼ਾਬਦੀ ਵਿੱਚ ClassA ਦੇ ਪ੍ਰੋਟੋਟਾਈਪ ਦੇ ਮੈਥਡਜ਼ ਨੂੰ ਪ੍ਰੋਟੋਟਾਈਪ ਲਾਈਨ ਰਾਹੀਂ ਵਿਰਾਸਤੀ ਕੀਤਾ ਗਿਆ ਹੈ। ਇਸ ਤਰ੍ਹਾਂ ਦੇ ਮਿਸ਼ਰਣ ਵਿੱਚ ਪ੍ਰੋਟੋਟਾਈਪ ਲਾਈਨ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਗਈ ਹੈ ਇਸ ਲਈ instanceof ਆਪਰੇਟਰ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਚਲਦਾ ਹੈ。
ਹੇਠ ਦੇ ਉਦਾਹਰਣ ਇਸ ਕੋਡ ਨੂੰ ਟੈਸਟ ਕਰਦੇ ਹਨ:
var objA = new ClassA("blue"); var objB = new ClassB("red", "John"); objA.sayColor(); //ਬਿਆਨ "blue" objB.sayColor(); //ਬਿਆਨ "red" objB.sayName(); //ਬਿਆਨ "John"
- ਪਿੰਡਾ ਪੰਨਾ ਵਿਰਾਸਤੀ ਮਕੈਨਿਜ਼ਮ ਉਦਾਹਰਣ
- ਅਗਲਾ ਪੰਨਾ JavaScript ਉੱਚ ਸਿੱਖਿਆ