මෙය ඉතා සරල මූලාකෘති පදනම් කරගත් වස්තු ආකෘතියක් වන අතර එය පැහැදිලි කිරීමක් අතරතුර නියැදියක් ලෙස සලකනු ඇත.
function Person(name){
this.name = name;
}
Person.prototype.getName = function(){
console.log(this.name);
}
var person = new Person("George");
මූලාකෘති සංකල්පය හරහා යාමට පෙර අප විසින් සලකා බැලිය යුතු තීරණාත්මක කරුණු කිහිපයක් තිබේ.
1- ජාවාස්ක්රිප්ට් ක්රියාකාරිත්වය සැබවින්ම ක්රියාත්මක වන ආකාරය:
පළමු පියවර ගැනීම සඳහා, ජාවාස්ක්රිප්ට් ක්රියාකාරීත්වය සැබවින්ම ක්රියාත්මක වන්නේ කෙසේද, එහි thisයතුරුපදය භාවිතා කරන ශ්රිතය වැනි පන්තියක් ලෙස හෝ එහි තර්ක සමඟ නිත්ය ශ්රිතයක් ලෙස, එය කරන්නේ කුමක්ද සහ එය නැවත ලබා දෙන්නේ කුමක් ද යන්න.
Personවස්තු ආකෘතියක් නිර්මාණය කිරීමට අපට අවශ්ය යැයි කියමු . නමුත් මෙම පියවර, මම උත්සාහ කළ හදන්නේ භාවිතා නොකර එම නිශ්චිත දෙයක් කරන්න prototypeසහ newමූල පදය .
ඉතින් මේ පියවරේදී functions, objectsසහ thisයතුරු පදයෙන් අපට ඇත්තේ සියල්ලම පමණි.
පළමු ප්රශ්නය වනුයේ යතුරු පද භාවිතා නොකර යතුරුපදය ප්රයෝජනවත් වන්නේ කෙසේද යන්නයිthisnew .
එබැවින් එයට පිළිතුරු දීමට අපට හිස් වස්තුවක් ඇති බව කියමු.
var person = {};
function Person(name){ this.name = name; }
function getName(){
console.log(this.name);
}
දැන් යතුරු පද භාවිතා නොකරnew අපට මෙම කාර්යයන් භාවිතා කරන්නේ කෙසේද. එබැවින් ජාවාස්ක්රිප්ට් ඒ සඳහා විවිධ ක්රම 3 ක් ඇත:
ඒ. පළමු ක්රමය නම් ශ්රිතය සාමාන්ය ශ්රිතයක් ලෙස හැඳින්වීම පමණි:
Person("George");
getName();//would print the "George" in the console
මෙම අවස්ථාවේදී, මෙය වර්තමාන සන්දර්භය වස්තුව වනු ඇත, එය සාමාන්යයෙන් windowබ්රව්සරයේ හෝ GLOBALතුළ ඇති ගෝලීය වස්තුව වේ Node.js. එහි අර්ථය වන්නේ බ්රව්සරයේ window.name හෝ Node.js හි GLOBAL.name, එහි වටිනාකම ලෙස "ජෝර්ජ්" යන්නයි.
බී. වස්තුවකට එහි ගුණාංග ලෙස අපට ඒවා ඇමිණිය හැකිය
- මෙය කිරීමට ඇති පහසුම ක්රමය වන්නේ හිස් personවස්තුව වෙනස් කිරීමයි , වැනි:
person.Person = Person;
person.getName = getName;
මේ ආකාරයෙන් අපට ඔවුන්ව මෙසේ හැඳින්විය හැකිය:
person.Person("George");
person.getName();// -->"George"
දැන් personවස්තුව සමාන ය:
Object {Person: function, getName: function, name: "George"}
- කිසියම් වස්තුවකට දේපලක් ඇමිණිය හැකි අනෙක් ක්රමයprototype නම් ඕනෑම ජාවාස්ක්රිප්ට් වස්තුවක නම සහිත සොයාගත හැකි එම වස්තුව භාවිතා කිරීමයි __proto__, සාරාංශ කොටසේ එය ටිකක් පැහැදිලි කිරීමට මම උත්සාහ කර ඇත්තෙමි. එබැවින් අපට සමාන ප්රති result ල ලබා ගත හැකිය:
person.__proto__.Person = Person;
person.__proto__.getName = getName;
නමුත් මේ ආකාරයෙන් අප කරන්නේ ඇත්ත වශයෙන්ම වෙනස් කිරීමයි Object.prototype, මන්ද අපි ජාවාස්ක්රිප්ට් වස්තුවක් සාහිත්යය ( { ... }) භාවිතා කරමින් නිර්මාණය කරන සෑම විටම එය පදනම් කරගෙන නිර්මාණය වන Object.prototypeඅතර එයින් අදහස් කරන්නේ එය අලුතින් සාදන ලද වස්තුවට නම් කරන ලද ලක්ෂණයක් ලෙස සම්බන්ධ වන බවයි __proto__, එබැවින් අපි එය වෙනස් කළහොත් , අපගේ පෙර කේත ස්නිපටයේ සිදු කර ඇති පරිදි, සියලු ජාවාස්ක්රිප්ට් වස්තු වෙනස් වනු ඇත, හොඳ පුහුණුවක් නොවේ. ඉතින් දැන් වඩා හොඳ පුරුද්ද කුමක් විය හැකිද:
person.__proto__ = {
Person: Person,
getName: getName
};
දැන් වෙනත් වස්තූන් සාමයෙන් සිටින නමුත් එය තවමත් හොඳ පුරුද්දක් ලෙස නොපෙනේ. එබැවින් අපට තවත් එක් විසඳුම් ඇත, නමුත් මෙම විසඳුම භාවිතා කිරීම සඳහා අපි personවස්තුව නිර්මාණය කළ කේත රේඛාවට ආපසු යා යුතුය ( var person = {};) ඉන්පසු එය වෙනස් කරන්න:
var propertiesObject = {
Person: Person,
getName: getName
};
var person = Object.create(propertiesObject);
දේ එය වන නව JavaScript නිර්මාණය කරමින් Objectසහ අනුයුක්ත propertiesObjectකිරීමට __proto__විශේෂණය. එබැවින් ඔබට කළ හැකි බවට වග බලා ගැනීම සඳහා:
console.log(person.__proto__===propertiesObject); //true
නමුත් මෙහි ඇති උපායශීලී කරුණ නම් __proto__, personවස්තුවේ පළමු මට්ටමේ අර්ථ දක්වා ඇති සියලුම ගුණාංග වෙත ඔබට ප්රවේශය තිබීමයි (වැඩි විස්තර සඳහා සාරාංශ කොටස කියවන්න).
ඔබ දකින පරිදි මෙම ක්රම දෙකෙන් thisඑකක් භාවිතා කිරීම හරියටම personවස්තුවට යොමු වේ.
ඇ. ජාවාස්ක්රිප්ට් සමග මෙම උත්සවයට ලබා තවත් ක්රමයක් thisභාවිතා කරන, ඇමතුම් හෝ අදාළ උත්සවයට පතා.
Apply () ක්රමය මඟින් ලබා දී ඇති මෙම අගය සහිත ශ්රිතයක් සහ අරාව (හෝ අරාව වැනි වස්තුවක්) ලෙස දක්වා ඇති තර්ක කැඳවයි.
සහ
ඇමතුම් () ක්රමය මඟින් මෙම අගය ලබා දී ඇති ශ්රිතයක් සහ තර්ක තනි තනිව සපයයි.
මගේ ප්රියතම ක්රමය වන අපට පහසුවෙන් අපගේ කාර්යයන් අමතන්න:
Person.call(person, "George");
හෝ
//apply is more useful when params count is not fixed
Person.apply(person, ["George"]);
getName.call(person);
getName.apply(person);
.ප්රොටොටයිප් ක්රියාකාරිත්වය හඳුනා ගැනීම සඳහා වැදගත් ආරම්භක පියවර මෙම ක්රම 3 වේ.
2- newමූල පදය ක්රියා කරන්නේ කෙසේද?
.prototypeක්රියාකාරීත්වය අවබෝධ කර ගැනීමේ දෙවන පියවර මෙයයි . ක්රියාවලිය අනුකරණය කිරීමට මා භාවිතා කරන්නේ මෙයයි:
function Person(name){ this.name = name; }
my_person_prototype = { getName: function(){ console.log(this.name); } };
මෙම කොටසේදී මම උත්සාහ කරන්නේ ජාවාස්ක්රිප්ට් විසින් ගනු ලබන සියලුම පියවරයන්, newමූලික පදය භාවිතා නොකර, සහ prototypeඔබ newයතුරු පද භාවිතා කරන විට . එබැවින් අප එසේ කරන විට new Person("George"), Personශ්රිතය ඉදිකිරීම්කරුවෙකු ලෙස සේවය කරයි, මේවා ජාවාස්ක්රිප්ට් එකින් එක කරයි:
ඒ. පළමුවෙන්ම එය හිස් වස්තුවක් සාදයි, මූලික වශයෙන් හිස් හැෂ් වැනි:
var newObject = {};
බී. ජාවාස්ක්රිප්ට් විසින් ගනු ලබන ඊළඟ පියවර වන්නේ සියලු මූලාකෘති වස්තු අලුතින් සාදන ලද වස්තුවට අනුයුක්ත කිරීමයි
අපට my_person_prototypeමෙහි මූලාකෘති වස්තුවට සමාන ය.
for(var key in my_person_prototype){
newObject[key] = my_person_prototype[key];
}
ජාවාස්ක්රිප්ට් ඇත්ත වශයෙන්ම මූලාකෘතියේ අර්ථ දක්වා ඇති ගුණාංග සම්බන්ධ කරන ආකාරය නොවේ. සත්ය ක්රමය මූලාකෘති දාම සංකල්පයට සම්බන්ධයි.
ඒ. & බී. මෙම පියවර දෙක වෙනුවට ඔබට කිරීමෙන් එකම ප්රති result ලය ලබා ගත හැකිය:
var newObject = Object.create(my_person_prototype);
//here you can check out the __proto__ attribute
console.log(newObject.__proto__ === my_person_prototype); //true
//and also check if you have access to your desired properties
console.log(typeof newObject.getName);//"function"
දැන් අපට getNameඅපගේ ශ්රිතය ඇමතිය හැකිය my_person_prototype:
newObject.getName();
ඇ. එවිට එය එම වස්තුව ඉදිකිරීම්කරුට ලබා දෙයි,
අපගේ නියැදිය සමඟ අපට මෙය කළ හැකිය:
Person.call(newObject, "George");
හෝ
Person.apply(newObject, ["George"]);
එවිට ඉදිකිරීම්කරුට අවශ්ය ඕනෑම දෙයක් කළ හැකිය මෙම ඉදිකිරීම්කරුගේ ඇතුළත මෙම නිර්මාණය කරන ලද වස්තුවයි.
අනෙක් පියවර අනුකරණය කිරීමට පෙර දැන් අවසාන ප්රති result ලය: වස්තුව {නම: "ජෝර්ජ්"}
සාරාංශය:
මූලික වශයෙන්, ඔබ ශ්රිතයක් සඳහා නව මූල පදය භාවිතා කරන විට , ඔබ එය ඉල්ලා සිටින අතර එම ශ්රිතය ඉදිකිරීම්කරුවෙකු ලෙස සේවය කරයි, එබැවින් ඔබ කියන විට:
new FunctionName()
ජාවාස්ක්රිප්ට් අභ්යන්තරව වස්තුවක්, හිස් හැෂ් එකක් සාදා එය එම වස්තුව ඉදිකිරීම්කරුට ලබා දෙයි, එවිට ඉදිකිරීම්කරුට අවශ්ය ඕනෑම දෙයක් කළ හැකිය, මන්ද මෙම ඉදිකිරීම්කරුගේ ඇතුළත මේ වන විට නිර්මාණය කරන ලද වස්තුව වන අතර එමඟින් එය ඔබට එම වස්තුව ලබා දෙයි. ඔබ ඔබේ ශ්රිතයේ ප්රතිලාභ ප්රකාශය භාවිතා කර නොමැති නම් හෝ return undefined;ඔබේ ක්රියාකාරී ශරීරයේ අවසානයේ ඔබ තබා තිබේ නම් .
එබැවින් ජාවාස්ක්රිප්ට් වස්තුවක් මත දේපලක් බැලීමට ගිය විට, එය කරන පළමු දෙය නම්, එය එම වස්තුව දෙස බැලීමයි. රහසිගත දේපලක් [[prototype]]අප සතුව ඇති අතර එය සාමාන්යයෙන් __proto__ජාවාස්ක්රිප්ට් දෙස බලයි. එය නැවත බැලූ විට __proto__, එය නැවතත් තවත් ජාවාස්ක්රිප්ට් වස්තුවක් වන තාක්, එයට එයටම ආවේණික වූ __proto__ගුණාංගයක් ඇත, එය ඊළඟට __proto__ශුන්ය වන ස්ථානයට ළඟා වන තෙක් එය ඉහළට හා ඉහළට යයි . ජාවාස්ක්රිප්ට් හි ඇති එකම වස්තුව ලක්ෂ්යය වන අතර එහි __proto__ගුණාංගය ශුන්ය වේ Object.prototype:
console.log(Object.prototype.__proto__===null);//true
ජාවාස්ක්රිප්ට් හි උරුමය ක්රියාත්මක වන්නේ එලෙසයි.

වෙනත් වචන වලින් කිවහොත්, ඔබ ශ්රිතයක් සඳහා මූලාකෘති දේපලක් ඇති විට සහ ඔබ ඒ පිළිබඳව නව දෙයක් කැඳවූ විට, ජාවාස්ක්රිප්ට් විසින් දේපල සඳහා අලුතින් නිර්මාණය කරන ලද වස්තුව දෙස බැලීමෙන් පසුව, එය ශ්රිතය දෙස බලා .prototypeමෙම වස්තුවට එහි ඇති බව පෙනේ. අභ්යන්තර මූලාකෘතියක්. සහ යනාදි.