سوال بپرسید
0

استفاده از تابع call و apply در جاوا اسکریپت

سوال بپرسید

من این کد رو نوشتم اما نمی دونم چرا اجرا نمی شه و در console خطای car2.car2Funct.apply میده!!

<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<p id="demo2"></p>

<script>
 function car(cN , fu , color , model){
     this.carName = cN;
     this.fuel = fu;
     this.color = color;
     this.model = model;
     this.nameModel = function(){
         return this.carName + " " + this.model;
     }
 }
 var car1 = new car("BMW" , "gas" , "blue" , 1996);
 var car2 = new car("volvo" , "benzin" , "red" , 2015 )
 Object.defineProperty(car2 , "car2Funct" , {get:  function () { return this.carName + " " + this.color;} });
var x = car2.car2Funct.apply(car1);
 document.getElementById("demo2").innerHTML=car2.car2Funct;
 var person = {
     fullName: function() {
         return this.firstName + " " + this.lastName;
     }
 }
</script>
</body>
</html>

 

برچسب ها:
گزارش سوال
پرسیده شده در
آمار بازدید: 93
لطفا متن خطا را به صورت کامل به سوال خود اضافه کنید (برای اینکار کافیست سوال را ویرایش کرده و مجددا ارسال کنید) – masoudsalehi در

1 پاسخ

1

همانطور که میدونید متد call, apply یا bind اکثرا برای bind کردن this به صورت explicit به کار میرود. اما نکته مهم این هست کدام this رو باید bind کند. اگر left had side عبارتی که نوشتید را مشاهده کنید خروجی ان string است که bind کردن this برای ان بی معنیست. باید left hand side ما تابع باشد تا this معنا پیدا کند.

پس در هنگام اضافه کردن property از طریق متد ()Object.defineProperty خروجی get ما بایستی یک تابع باشد نه یک string!

// This is the way you created a new property and return a string
Object.defineProperty(car2, "car2Func", { get: function () { return this.carName + " " + this.color } });

// And here you are trying to bind the method on a string!
var x = car2.car2Func.apply(car1); // TypeError: car2.car2Funct.apply is not a function (of course it is not function, it's a string!)

// So the right way you define property is you return a function not a string
Object.defineProperty(car2, "car2Func", { get: function () { return function () { return this.carName + " " + this.color; } } });

// And now you can bind THIS with call mehode
var x = car2.car2Func.apply(car1); // BMW blue

// As you can see the car2Func in your example return string and that was a mistake

 

rsdc137 (21)