مقدمة إلى ecmascript5
بادئ ذي بدء ، يجب علينا معرفة أن Ecmascript هو إله. نحن نعلم أن JavaScript أو LiveScript تم إنشاؤه في الأصل بواسطة NetScape ، وبعد ذلك Microsoft تابعت أيضًا لإنشاء JScript. Scriptease لديها أيضا cenvi الخاصة بها. وبهذه الطريقة ، هناك ثلاثة إصدارات من البرنامج النصي للمتصفح التي تقوم بها. يفهم الجميع هذا الفوضى ، وبالتالي يتم وضع مسألة التقييس على جدول الأعمال. في عام 1997 ، تم تقديم الاقتراح القائم على JavaScript1.1 إلى جمعية مصنعي الكمبيوتر الأوروبية (Computer M anufacturers A Sector). أخيرًا ، قام الجميع بتطوير ECMA-262 ، وهو معيار لغة برمجة جديدة تسمى ECMASCRIPT. في العام التالي ، اعتمدت ISO/IEC (المنظمة الدولية للتوحيد واللجنة الدولية للكهربة الفنية) ECMASCRIPT كمعيار. بعد ذلك ، سيكون العالم سلميًا. يستخدم مصنعو المتصفح الرئيسيين ECMASCRIPT كأساس لتنفيذ كل منهما لجافا سكريبت. بالطبع ، إنها مجرد الأساس ولم يتم اتباعها تمامًا. خلاف ذلك ، لن يكون لدينا الكثير من مشكلات توافق المتصفح.
ما هو ecmascript5؟ كما يوحي الاسم ، فإن هذا هو الإصدار الخامس من هذا الشيء الغريب ، تمامًا مثل iPhone 5. ECMASCRIPT3 ، الذي نستخدمه الآن في كثير من الأحيان ، يعتبر لغة برمجة حقيقية بدلاً من لعبة ، وأصبحت شائعة جدًا.
نص:
لطالما كان لدي فهم خاطئ لـ GET/SET من قبل ، وأعتقد أن Get Set هي طريقة سمة كائن. كان لدي أيضًا العديد من الأسئلة بعد قراءة مدونات الآخرين. اليوم ، أجرى النظام الكثير من الاختبارات وأخيراً اكتشفها. (إذا اجتازت اختبارات القراءة والكتابة التجريبية بنفسك ، إذا كان هناك أي شيء غير صحيح ، فنحن نرحب بك في الانتقاد وتصحيح لي)
لا يعد ملحق GET/SET خاصية كائن ، بل خاصية خاصية. يجب على الجميع التمييز بوضوح. يتم استخدام الميزات داخليًا فقط ، لذلك لا يمكن الوصول إليها مباشرة في JavaScript. للإشارة إلى أن الخصائص هي القيم الداخلية محاطة بأقواس بين الفريقين ، مثل [[القيمة]].
1. اسمحوا لي أن أقدم باختصار خصائص السمات هذه (هنا مصادقة بسيطة)
(1) سمة البيانات - الموضع الذي يحتوي على قيمة بيانات. يمكن لهذا الموقف قراءة وكتابة القيم.
سمات البيانات لها أربع خصائص تصف سلوكها:
[[التكوين]]: هل هو قابل للتكوين؟
[[التعداد]]: هل هو التعداد؟
[[قابل للكتابة]]: هل هو قابل للقراءة
[[القيمة]]: قيمة السمة
(2) سمة سمة Accessor - لا تحتوي على قيم بيانات ، تحتوي على وظيفة getter و setter (هاتان الوظيفين غير مطلوبة)
تحتوي خصائص الإكسسور أيضًا على أربع خصائص تصف سلوكها:
[[التكوين]]: هل هو قابل للتكوين؟
[[التعداد]]: هل هو التعداد؟
[[GET]]: الوظيفة المسمى عند قراءة سمات ، الافتراضي غير محدد
[[set]]: الوظيفة المسمى عند كتابة السمات ، الافتراضي غير محدد
2. هنا نركز على تقديم [[GET]]/[[SET]] هو ما نسميه GET/SET AUCKING
دعنا نتحدث أولاً عن الخصائص السلوكية للملحق/مجموعة GET/SET المذكورة في الكتاب: يمكن قراءة ومكتب الإكسسور GET/SET دون تعريف. يمكنك أيضا تحديد واحد فقط. إذا تم تحديد الحصول على الحصول على السمات الموصوفة فقط ، لا يمكن قراءة فقط ولا يمكن كتابتها. إذا تم تحديد تعيين فقط ، لا يمكن كتابة السمات الموصوفة إلا غير قابلة للقراءة.
(1) طريقة الحصول على مجموعة GET الأصلية هي كما يلي:
الدالة foo (val) {var value = val ؛ this.getValue = function () {value ؛الرمز أعلاه هو مجرد طريقة الحصول على مجموعة جيدة باستخدام نطاق الإغلاق. لاحظ أن الطريقة هي طريقة السمة لكائن المثيل ، وليس خاصية السمة. إذا لم يتم تعريفه ، فلن تكون قيمة القيمة متاحة
دالة foo (val) {var value = val ؛/* this.getValue = function () {return value ؛} ؛ this.setValue = function (val) {value = val ؛} ؛*/} var obj = new foo ("Hello") ؛ ALERT (OBJ.Value) ؛الأمثلة التالية هي أيضًا طرق سمة للكائنات ، وليس خصائص السمات.
var obj = {name: "John" ، get: function () {return this.age ؛} // يتم تعريف الحصول على فقط ، لم يتم تعريف تعيين ، ولكن لا يزال بإمكانه القراءة والكتابة والسمات ، حتى لو كانت العمر // لن تؤثر الطريقة المحددة هنا على السمات المحددة ، تعيين سمات السمات. مجرد سمة كائن عادي} ؛ تنبيه (obj.name) ؛ // جون قابلة للقراءة obj.name = "jack" ؛ // تنبيه قابل للكتابة (obj.name) ؛ // jack(2) الحصول على/تعيين ملحق كخاصية سمة الملحق.
مرة أخرى ، إنها ليست سمة كائن ، فقد قرروا ما إذا كان يمكن قراءة السمة وكتابتها. إذا لم يتم تعيينه ، فلا بأس ، تمامًا مثل القراءة والكتابة بشكل طبيعي (يمكن قراءة الخصائص أو قراءةها
اكتب ، اقرأ وكتابة الوصول إلى العقار نفسه)
هناك طريقتان لتغيير سمة GET /SET:
أ. استخدم object.defineProperty ()
var object = {_ name: "daisy"} ؛ object.defineProperty (الكائن ، "الاسم" ، {// اسم الطريقة هنا يعني أنه يتم تعريف خاصية الاسم (بحيث يمكن الوصول إليها من خلال object.name) ، فقط يتم تعريف إدخال getter ، لا [القيمة]] this._name ؛}}) ؛ ALERT (object.name) ؛ // "daisy" object.name = "jack" ؛ // فقط يتم تعريف الملقح getter ، وبالتالي فإن الكتابة غير صالحة (object.name) ؛ // "daisy" name.name = "jack"لاحظ أن اسم الخاصية في Object.DefineProperty (كائن ، Pro ، {}) يجب أن يتوافق مع الخصائص التي يتم الوصول إليها بواسطة Object.pro.
ب. استخدم الكلمة الرئيسية Get Set:
var object = {_ name: "daisy" ، Get Name () {// اسم الطريقة هنا يعني أنه يتم تعريف سمة الاسم (بحيث يمكن الوصول إليها من خلال Object.name) ، يتم تعريف ملف Getter فقط ، لا يتم تعريف قيمة [[value]]. إرجاع هذا. التنبيه (object.name) ؛ // daisy طريقة إزالة السطح السفلي هنا هي ديزي ؛ بالإضافة إلى أنه غير محدد.الطريقتين أعلاه متكافئة. لاحظ أن كلتا الطريقتين أعلاه سيكون لها سمتان في كائن الكائن: _name (مع القيمة الأولية) (بدون قيمة أولية) ، والتي يمكن رؤيتها من خلال وحدة التحكم في المتصفح.
إذن متى يتم تعريف سمة الاسم هذا حقًا؟ نعلم أن Object.defineProperty (كائن ، Pro ، {}) يمكنه تحديد خاصية جديدة للكائن. نظرًا لأن GET PRO () {}/set pro () {} و Object.DefineProperty (Object ، pro ، {}) متكافئة ، سيتم أيضًا تحديد خاصية جديدة. هذا هو السبب في وجود اثنين من الخصائص في الكائن.
(3) رمز التنفيذ الخاص بـ GET and SET AUCKING في JavaScript في هذه المقالة: تتعلق بتنفيذ GET and Set للمعايير القياسية: أفكار معقولة
كتبت مثالاً بنفسي
الدالة foo (val) {this.value = val ؛ // يتم تعريف سمة القيمة وليس _value} foo.prototype = {set value (val) {// لاحظ أن اسم الطريقة وسمات السمة هما نفس اسم الأسلوب ، وسمات القيمة والمعرفة والقيمة. يتم تعريف السمة في النموذج الأولي لإرجاع this._value ؛}} ؛ // إرجاع الملحق ويعطيها كلاهما _name ، ولا يوجد تعريف هنا. لماذا يمكن قراءتها أو كتابتها؟ ؟ ؟ ؟ var obj = new Foo ("Hello") ؛ ALERT (obj.value) ؛ // "Hello" obj.value = "yehoo" ؛ تنبيه (obj.value) ؛ // "Yehoo"من أجل حل السؤال أعلاه ، تم إجراء الكثير من الاختبارات ، دعونا نلقي نظرة عليه واحدًا تلو الآخر:
انظر أولاً إلى هذا المثال. يتم تعريف ميزة الحصول فقط في النموذج الأولي. عند قراءة سمة القيمة في قيمة obj.value ، ابحث عنها في المثيل بدونها ، ثم ابحث عنها في النموذج الأولي. يتم استدعاء طريقة GET ، والتي لا يمكن قراءتها إلا ولكنها غير مكتوبة.
الدالة foo (val) {this._value = val ؛ // تم التأكيد على السمة هنا ، تهيئة السمة _value لكائن المثيل ، فإن سمة _value قابلة للقراءة وقابلة للكتابة} this._value = val ؛ //} ، احصل على value () {// اسم الطريقة هو نفس اسم السمة ، يحدد سمة القيمة وسمة الحصول على النموذج الأولي this._value ؛}} ؛ var obj = new foo ("Hello") ؛ ALERT (obj.value) ؛ // Hello تصل إلى القيمة في النموذج الأولي ، فإن السمة OBJ.Value = "Yehoo" ؛ // فقط تحدد سمة الحصول على سمة الاسم ، لذلك لا يمكن قراءتها إلا ولكنها غير مكتوبة. الكتابة تنبيه غير صالح (obj.value) ؛ // helloإذا تمت إزالة this._value من السطح السفلي في المُنشئ ، فإن سمة القيمة المحددة في النموذج الأولي تحدد سمة GET. لا يزال بإمكانك التحكم في قراءة وتكتب سمة القيمة. بمعنى آخر ، عندما تصل OBJ.value السمات ، سيتم استدعاء طريقة GET ، أولاً البحث في الكائن نفسه ، إن لم يكن ، ثم البحث في النموذج الأولي. إذا لم يكن هناك شيء ، فسيتم اعتباره غير محدد. الافتراضي يمكن قراءته وقابل للكتابة.
الدالة foo (val) {this.value = val ؛ // فقط يتم تعريف ميزة الحصول على القيمة في النموذج الأولي ، وبالتالي فإن الكتابة هنا غير صالحة} foo.prototype = {// set value (val) {// لاحظ أن اسم الطريقة وسمات السمة هي نفسها ، ميزة المحددة لسمة القيمة المحددة في النموذج الأولي // هذا. value () {// اسم الطريقة هو نفس اسم السمة. يتم تعريف سمة القيمة وسمة الحصول عليها في النموذج الأولي. إرجاع this._value ؛}} ؛ var obj = new foo ("Hello") ؛ // "Hello" لم يتم كتابة تنبيه ناجح (OBJ.Value) ؛ // غير محدد OBJ.Value = "yehoo" ؛ // فقط محدد السمة الحصول على GET ، لذلك لا يمكن قراءتها إلا غير مكتوبة ، والكتابة تنبيه غير عادي (obj.value)لإثبات أن المثال أعلاه قابل للقراءة وغير قابل للكتابة: اكتب يدويًا _value: "hah" ، يمكنك قراءة القيمة ولكن لا يمكنك كتابتها.
الدالة foo (val) {this.value = val ؛ // فقط يتم تعريف ميزة الحصول على القيمة في النموذج الأولي ، وبالتالي فإن الكتابة هنا غير صالحة} foo.prototype = {// set value (val) {// لاحظ أن اسم الطريقة وسمات السمة هي نفسها ، ميزة المحددة لسمة القيمة المحددة في النموذج الأولي // هذا. value () {// اسم الطريقة هو نفس اسم السمة. يتم تعريف سمة القيمة وسمة الحصول عليها في النموذج الأولي. إرجاع this._value ؛}} ؛ var obj = new foo ("Hello") ؛ // "Hello" لم يتم كتابة تنبيه ناجح (obj.value) ؛ // "hah" obj.value = "yehoo" ؛ // فقط يتم تعريف سمة الحصول على ، لذلك لا يمكن قراءتها إلا ولكنها غير مكتوبة ، والكتابة هي تنبيه غير عادي (obj.value) ؛إذا كانت القيمة: "HAH" مكتوبة يدويًا ، فهل يمكنني السعي لقراءة قيمة القيمة؟ نظرًا لعدم تحديد هذا.
الدالة foo (val) {this.value = val ؛ // فقط يتم تعريف ميزة الحصول على القيمة في النموذج الأولي ، وبالتالي فإن الكتابة هنا غير صالحة} foo.prototype = {// set value (val) {// لاحظ أن اسم الطريقة والسمات هي نفسها ، يتم تحديد ميزة تعيين قيمة القيمة في النمط الهرمي // هذا. إذا تمت كتابة قيمة القيمة يدويًا ، نظرًا لأن طريقة GET تُرجع هذا ._value ، لا يمكن قراءة القيمة بشكل صحيح: "hah" // طالما أن GET PRO () {} و set pro () {} يتم الإعلان عن سمات ، فيمكنهم القراءة والكتابة ، ولكن إذا كان تعريف الوظيفة خاطئًا ، فلا يمكن الوصول إلى قيمة الخاصية الصحيحة حسب الاقتضاء. Value () {// اسم الطريقة واسم السمة متماثلان. يتم تعريف سمة القيمة وميزات GET في النموذج الأولي. إرجاع this._value ؛}} ؛ var obj = new foo ("Hello") ؛ // "Hello" لم يتم كتابة تنبيه بنجاح (obj.value) ؛ // undefined قراءة غير صالحة لأنه طالما أن obj.value ، احصل على إرجاع هذا. تنبيه (obj.value) ؛ // غير محددةبالنظر إلى هذا المثال ، يتم تعريف Get Set ، ولكن يتم إرجاع هذا. يمكنك أن تجد أنه يمكن قراءة القيمة والكتابة. قم بإزالة طريقة GET SET في النموذج الأولي ويمكن أن تكون قابلة للقراءة أو مكتوبة
دالة foo (val) {this.value = val ؛} foo.prototype = {set value (val) {this._value = val ؛} ، get value () {return this._value ؛}} ؛ var obj = new foo ("Hello") ؛ ALERT (obj.value) ؛ // hello obj.value = "yehoo" ؛ ALERT (obj.value) ؛ // yehoo function foo (val) {this.value = val ؛ foo ("Hello") ؛ ALERT (obj.value) ؛ // hello obj.value = "yehoo" ؛ Alert (obj.value) ؛ // yehooلخص
فقط سمة الحصول على pro () {} قابلة للقراءة وغير قابلة للكتابة ؛
أعلن فقط سمة Set Pro () {} لتكون قابلة للكتابة وغير قابلة للقراءة.
إذا لم يتم إعلان أي من الإعلانات ، فإن السمات قابلة للقراءة وقابلة للكتابة ؛
إذا تم إصدار جميع الإعلانات ، فاقرأ وكتابة وفقًا للطريقة المحددة بواسطة GET SET ؛
إذا تم الإعلان عن كل شيء ، ولكن لا يمكن قراءة طريقة القراءة والكتابة المحددة بشكل صحيح ، فسوف تفشل الحصول على/SET. كن الافتراضي القابل للقراءة وقابل للكتاب
تحدد سمة القيمة المحددة في النموذج الأولي سمة GET. لا يزال بإمكانك التحكم في قراءة وتكتب سمة القيمة. بمعنى آخر ، عندما تصل OBJ.Value السمات ، سيتم استدعاء طريقة GET ، والبحث أولاً في الكائن نفسه ، ثم البحث في النموذج الأولي. إذا لم يكن هناك شيء ، فسيتم اعتباره غير محدد. الافتراضي يمكن قراءته وقابل للكتابة.
التجديد:
سواء باستخدام GET PRO () {}/set pro () {} أو object.defineProperty (Object ، pro ، {get: function () {return this._name ؛}}) ؛لا يمكن الإبلاغ عن PRO مثل إرجاع هذا. ، وإلا سيتم الإبلاغ عن الخطأ التالي: (لا أعرف السبب ، يبدو أنه فائض في التدفق الناجم عن مكالمتي الخاصة)
بعد تصحيح الماجستير ، أفهم لماذا يتم الإبلاغ عن الخطأ هنا: إذا تم إرجاع القيمة.