تابستون داره تموم میشه ها، فرصت‌ها محدودن کلی آفر جذاب در کمپین تابستون🔥👇
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ حامد معتقد
پیدا نکردن آبجکت با نام id مربوط به جدول در آبجکت window (سوال مجدد)
جامعه جاوا اسکریپت ایجاد شده در ۰۷ مرداد ۱۴۰۲

با سلام مجدد

استاد در ویدئوی فوق در زمان 26:18 دقیقا این جمله رو میگن: "آبجکت table1-test به عنوان یکی از property‌های آبجکت اصلی window وجود داره"

و یا در زمان 27:11 میگن: "آبجکت table2-test داخل آبجکت window وجود داره"

خب پس برداشت من اینه که اگه در انتهای همین کدی که استاد تو آموزش دارن تایپ میکنن (و در پیوست فایل‌های این جلسه وجود داره) تایپ کنیم

console.log(window)

باید توی کنسول که آبجکت window باز میشه، table2-test در پراپرتی‌های window قابل رویت باشه. اما نیست! چرا؟؟؟؟؟؟؟؟؟؟

ببینید:

7577-Capture.JPG

711f-Capture11.JPG

و البته این لیست ادامه داره ... تا انتها رو من چک کردم و پیدا نکردم.

سلام،

داخل node‌های html در پراپرتی document قرار گرفته است.

محسن موحد ۰۸ مرداد ۱۴۰۲، ۱۲:۲۰

ممنونم از یاد آوری این نکته. بله بنده هم متوجه هستم که « داخل node‌های html در پراپرتی document » قابل دسترس هستن اما این پاسخ سوال من نبود. اگر هم اینگونه استدلال می‌کنید که چون این id‌ها داخل document هستن برای window هم قابل دسترس هستند؛ باید عرض کنم که، پاسخ شما برای من قانع کننده نیست. استدلال خودم رو به شکل زیر توضیح میدم...


فرض: من استدلال شما رو پذیرفتم. => نتیجه: اگه یه آبجکت پراپرتیِ یه آبجکتِ دیگه باشه باید پراپرتی‌های آبجکت داخلی توسط والدش قابل دسترس باشن. یعنی مثلا:

let myWindowObj = {
win1: "val1",
win2: "val2",
myDocumentObj: {
  doc1: "val3",
  doc2: "val4"
  },
};

حالا اگه به این شکل بنویسم:

console.log(myWindowObj["doc1"]);

پاسخ کنسول به من undefined هست. در حالی که رابطه table2-test با آبجکت window چنین نیست و ما به راحتی می‌نویسیم:

console.log(window["table2-test"]);

ظاهرا به تناقض می‌رسیم. علت چیست؟



حامد معتقد ۰۸ مرداد ۱۴۰۲، ۱۴:۴۵

برای درک این موضوع و اثباتش باید سورس مفسر جاوااسکریپت رو بررسی کنید.

این موضوعی که مطرح کردید توسط انجین جاوااسکریپت مدیریت میشه و محتوای بسیار کمی در موردش نوشته شده...

اگر دانستن این موضوع براتون جذابه این مقاله را خط به خط بررسی کنید که دقیقاً چه اتفاقی می‌افتد. روی تمامی کلماتی که لینک شده اند کلیک کنید و توضیحاتشان را مطالعه کنید، سمپل کد مفسر هم آمده است. البته این رو بگم روشی غیر استاندارد است و توصیه به استفاده اش نمیشود. در ضمن نیاز دارید که در مورد شی گرایی و آبجکت‌ها و inheritance و prototype و getter و setter‌ها اطلاعات کسب کنید چون کدی که در مقاله نشان داده شده و در مفسر جاوااسکریپت با زبان c++ و با getter و setter پیاده شده است.

مثالی که در بالا زدید برای اثبات این موضوع درست نیست و در مفسر تمامی اینترفیس‌ها و آبجکت‌ها نهایتاً از یک آبجکت والد مشتق شده اند(مربوط به مفسر زبان جاواسکریپت است) و با پیاده سازی getter در والد من میتوانم به تمامی پراپرتی‌های والد هم دسترسی مستقیم پیدا کنم. البته این مورد رو در خود زبان جاوااسکریپت هم میتوان پیاده کرد و نشان داد منتها سازوکار اصلی رو خود مفسر مدیریت میکنه. داخل getter مشخص میشود که چطور به dom‌ها دسترسی پیدا کرد.

شما فرض کنید تگی دارید id=test میتوانید به این صورت‌ها هم دسترسی بگیرید:

Window.prototype.test
window.__proto__.test
بهترین پاسخ
محسن موحد ۱۱ مرداد ۱۴۰۲، ۱۶:۴۳

سلام خدمت شما

جدای از توضیحات محسن نحوه دسترسی به پراپرتی‌های فرزند رو اشتباه نوشتید. تو نمونه کدی که خودتون گذاشتید اینطور دسترسی دارید.

console.log(myWindowObj.myDocumentObj.doc1)


لقمان آوند ۱۱ مرداد ۱۴۰۲، ۱۶:۵۰