Browse Source

min apply

Ivan Grinkin 8 năm trước cách đây
mục cha
commit
f456190051
1 tập tin đã thay đổi với 52 bổ sung1 xóa
  1. 52 1
      07ObjectsFunctionalStyle.md

+ 52 - 1
07ObjectsFunctionalStyle.md

@@ -238,7 +238,7 @@ function Person(name, surname){
 
     this.getFullName = function (){
         if ("fatherName" in person){
-            return getFullLongName() //передаем текущий объект person как this в getFullLongName
+            return getFullLongName() 
         }
         else {
             return getFullShortName()
@@ -252,3 +252,54 @@ alert(person.getFullName())
 ```
 
 В отличие от `this`, переменная `me` всегда будет указывать на `this`, который был при создании объекта (если, конечно, вы не поменяете значение `me`)
+
+## `call` и `apply`
+
+Эти два метода объекта `Function` позволяют вызвать функцию, указав `this` и параметры:
+
+```javascript
+function Person(name, surname){
+    this.name    = name
+    this.surname = surname
+
+    this.getFullName = function(){
+        return this.name + (this.fatherName ? " " + this.fatherName + " " : " ") + this.surname
+    }
+}
+
+function say(greet, aftergreet){
+    alert(greet + " " + this.getFullName() + aftergreet)
+}
+
+var person        = new Person("Ivan", "Petroff")
+
+say.call(person,"Hello", "!!111!!!")
+say.apply(person,["Hi", "by apply"]) //feel the difference
+```
+
+То, что `apply` принимает массив в качестве набора параметров функции помогает **творить чудеса**:
+
+```javascript
+var someArray = [1,5,7,-17,100500];
+
+Math.min(someArray) //Math.min так не умеет
+Math.min(1,5,7,-17,100500,-123) // зато умеет так
+Math.min.apply(Math,someArray) // ...и мы этим воспользуемся...
+
+// или же сделаем свой min в someArray:
+
+someArray.min = function(){
+    return Math.min.apply(Math,someArray);
+}
+
+someArray.min()
+
+// или же сделаем свой min для всех массивов 
+
+Array.prototype.min = function(){ 
+    return Math.min.call(Math, this) 
+}
+
+[100, 500,  -100500].min()
+["a", "b", "Z"].min()
+```