上下文 代表 this 变量的值, 以及 它的 指代;
它决定一个函数怎么被调用;
当一个函数作为一个对象的方法被调用的时候, this总是指向 调用这个方法的对象.
-----
1 ,情况一: 字面量对象中的this
1 var pet = { 2 words: '...', 3 speak: function(){ 4 console.log(this.words); 5 console.log(this === pet); 6 } 7 } 8 9 pet.speak();
pet对象调用 speak方法, this 指向 pet对象; 因此 this.words 等于 '...';
this === pet ,正确.
2.情况二: 普通函数中的 this
1 //2: 普通函数中的this 2 3 function pet(words) 4 { 5 this.words = words; 6 7 console.log(this.words); 8 console.log(this === global); 9 } 10 11 pet('test,test');
可见,在 作为普通函数使用的时候, this 是 指代 最顶级的全局变量的, 在 浏览器中是 window对象 ; 在node中 是 global.
---------------------------------------------------------------
输出 global对象.
1 //2: 普通函数中的this 2 3 function pet(words) 4 { 5 this.words = words; 6 7 console.log(this.words); 8 console.log(this === global); 9 console.log(global); 10 } 11 12 pet('test,test');
1 D:\node>node context.js 2 test,test 3 true 4 { DTRACE_NET_SERVER_CONNECTION: [Function], 5 DTRACE_NET_STREAM_END: [Function], 6 DTRACE_HTTP_SERVER_REQUEST: [Function], 7 DTRACE_HTTP_SERVER_RESPONSE: [Function], 8 DTRACE_HTTP_CLIENT_REQUEST: [Function], 9 DTRACE_HTTP_CLIENT_RESPONSE: [Function], 10 COUNTER_NET_SERVER_CONNECTION: [Function], 11 COUNTER_NET_SERVER_CONNECTION_CLOSE: [Function], 12 COUNTER_HTTP_SERVER_REQUEST: [Function], 13 COUNTER_HTTP_SERVER_RESPONSE: [Function], 14 COUNTER_HTTP_CLIENT_REQUEST: [Function], 15 COUNTER_HTTP_CLIENT_RESPONSE: [Function], 16 global: [Circular], 17 process: 18 process { 19 title: 'C:\\WINDOWS\\system32\\cmd.exe - node context.js', 20 version: 'v4.5.0', 21 moduleLoadList: 22 [ 'Binding contextify', 23 'Binding natives', 24 'NativeModule events', 25 'NativeModule buffer', 26 'Binding buffer', 27 'NativeModule internal/util', 28 'Binding util', 29 'NativeModule timers', 30 'Binding timer_wrap', 31 'NativeModule _linklist', 32 'NativeModule assert', 33 'NativeModule util', 34 'Binding uv', 35 'NativeModule path', 36 'NativeModule module', 37 'NativeModule internal/module', 38 'NativeModule vm', 39 'NativeModule fs', 40 'Binding fs', 41 'NativeModule constants', 42 'Binding constants', 43 'NativeModule stream', 44 'NativeModule _stream_readable', 45 'NativeModule _stream_writable', 46 'NativeModule _stream_duplex', 47 'NativeModule _stream_transform', 48 'NativeModule _stream_passthrough', 49 'Binding fs_event_wrap', 50 'NativeModule console', 51 'Binding tty_wrap', 52 'NativeModule tty', 53 'NativeModule net', 54 'NativeModule internal/net', 55 'Binding cares_wrap', 56 'Binding tcp_wrap', 57 'Binding pipe_wrap', 58 'Binding stream_wrap', 59 'Binding signal_wrap' ], 60 versions: 61 { http_parser: '2.7.0', 62 node: '4.5.0', 63 v8: '4.5.103.37', 64 uv: '1.9.1', 65 zlib: '1.2.8', 66 ares: '1.10.1-DEV', 67 icu: '56.1', 68 modules: '46', 69 openssl: '1.0.2h' }, 70 arch: 'x64', 71 platform: 'win32', 72 release: 73 { name: 'node', 74 lts: 'Argon', 75 sourceUrl: 'https://nodejs.org/download/release/v4.5.0/node-v4.5.0.tar.gz', 76 headersUrl: 'https://nodejs.org/download/release/v4.5.0/node-v4.5.0-headers.tar.gz', 77 libUrl: 'https://nodejs.org/download/release/v4.5.0/win-x64/node.lib' }, 78 argv: 79 [ 'D:\\Program Files\\nodejs\\node.exe', 80 'D:\\node\\context.js' ], 81 execArgv: [], 82 env: 83 { ALLUSERSPROFILE: 'C:\\ProgramData', 84 APPDATA: 'C:\\Users\\dc5yy\\AppData\\Roaming', 85 CommonProgramFiles: 'C:\\Program Files\\Common Files', 86 'CommonProgramFiles(x86)': 'C:\\Program Files (x86)\\Common Files', 87 CommonProgramW6432: 'C:\\Program Files\\Common Files', 88 COMPUTERNAME: 'DESKTOP-2I328NT', 89 ComSpec: 'C:\\WINDOWS\\system32\\cmd.exe', 90 configsetroot: 'C:\\WINDOWS\\ConfigSetRoot', 91 FPS_BROWSER_APP_PROFILE_STRING: 'Internet Explorer', 92 FPS_BROWSER_USER_PROFILE_STRING: 'Default', 93 HOMEDRIVE: 'C:', 94 HOMEPATH: '\\Users\\dc5yy', 95 LOCALAPPDATA: 'C:\\Users\\dc5yy\\AppData\\Local', 96 LOGONSERVER: '\\\\DESKTOP-2I328NT', 97 MOZ_PLUGIN_PATH: 'C:\\Program Files (x86)\\Foxit Software\\Foxit Reader\\plugins\\', 98 NUMBER_OF_PROCESSORS: '4', 99 OneDrive: 'C:\\Users\\dc5yy\\OneDrive', 100 OS: 'Windows_NT', 101 Path: 'C:\\Program Files (x86)\\Intel\\iCLS Client\\;C:\\Program Files\\Intel\\iCLS Client\\;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\IPT;D:\\Program Files\\TortoiseSVN\\bin;C:\\Program Files (x86)\\VisualSVN Server\\bin;D:\\Program Files\\nodejs\\;C:\\Users\\dc5yy\\AppData\\Roaming\\npm;C:\\Users\\dc5yy\\AppData\\Local\\Microsoft\\WindowsApps;D:\\xampp\\apache\\bin', 102 PATHEXT: '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 103 PROCESSOR_ARCHITECTURE: 'AMD64', 104 PROCESSOR_IDENTIFIER: 'Intel64 Family 6 Model 60 Stepping 3, GenuineIntel', 105 PROCESSOR_LEVEL: '6', 106 PROCESSOR_REVISION: '3c03', 107 ProgramData: 'C:\\ProgramData', 108 ProgramFiles: 'C:\\Program Files', 109 'ProgramFiles(x86)': 'C:\\Program Files (x86)', 110 ProgramW6432: 'C:\\Program Files', 111 PROMPT: '$P$G', 112 PSModulePath: 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules', 113 PUBLIC: 'C:\\Users\\Public', 114 SESSIONNAME: 'Console', 115 SystemDrive: 'C:', 116 SystemRoot: 'C:\\WINDOWS', 117 TEMP: 'C:\\Users\\dc5yy\\AppData\\Local\\Temp', 118 TMP: 'C:\\Users\\dc5yy\\AppData\\Local\\Temp', 119 USERDOMAIN: 'DESKTOP-2I328NT', 120 USERDOMAIN_ROAMINGPROFILE: 'DESKTOP-2I328NT', 121 USERNAME: 'admin', 122 USERPROFILE: 'C:\\Users\\dc5yy', 123 VISUALSVN_SERVER: 'C:\\Program Files (x86)\\VisualSVN Server\\', 124 windir: 'C:\\WINDOWS' }, 125 pid: 7292, 126 features: 127 { debug: false, 128 uv: true, 129 ipv6: true, 130 tls_npn: true, 131 tls_sni: true, 132 tls_ocsp: true, 133 tls: true }, 134 _needImmediateCallback: false, 135 execPath: 'D:\\Program Files\\nodejs\\node.exe', 136 debugPort: 5858, 137 _startProfilerIdleNotifier: [Function: _startProfilerIdleNotifier], 138 _stopProfilerIdleNotifier: [Function: _stopProfilerIdleNotifier], 139 _getActiveRequests: [Function: _getActiveRequests], 140 _getActiveHandles: [Function: _getActiveHandles], 141 reallyExit: [Function: reallyExit], 142 abort: [Function: abort], 143 chdir: [Function: chdir], 144 cwd: [Function: cwd], 145 umask: [Function: umask], 146 _kill: [Function: _kill], 147 _debugProcess: [Function: _debugProcess], 148 _debugPause: [Function: _debugPause], 149 _debugEnd: [Function: _debugEnd], 150 hrtime: [Function: hrtime], 151 dlopen: [Function: dlopen], 152 uptime: [Function: uptime], 153 memoryUsage: [Function: memoryUsage], 154 binding: [Function: binding], 155 _linkedBinding: [Function: _linkedBinding], 156 _setupDomainUse: [Function: _setupDomainUse], 157 _events: 158 { newListener: [Function], 159 removeListener: [Function], 160 SIGWINCH: [Object] }, 161 _rawDebug: [Function], 162 _eventsCount: 3, 163 domain: null, 164 _maxListeners: undefined, 165 EventEmitter: 166 { [Function: EventEmitter] 167 EventEmitter: [Circular], 168 usingDomains: false, 169 defaultMaxListeners: 10, 170 init: [Function], 171 listenerCount: [Function] }, 172 _fatalException: [Function], 173 _exiting: false, 174 assert: [Function], 175 config: { target_defaults: [Object], variables: [Object] }, 176 nextTick: [Function: nextTick], 177 _tickCallback: [Function: _tickCallback], 178 _tickDomainCallback: [Function: _tickDomainCallback], 179 stdout: [Getter], 180 stderr: [Getter], 181 stdin: [Getter], 182 openStdin: [Function], 183 exit: [Function], 184 kill: [Function], 185 mainModule: 186 Module { 187 id: '.', 188 exports: {}, 189 parent: null, 190 filename: 'D:\\node\\context.js', 191 loaded: false, 192 children: [], 193 paths: [Object] } }, 194 GLOBAL: [Circular], 195 root: [Circular], 196 Buffer: 197 { [Function: Buffer] 198 poolSize: 8192, 199 from: [Function], 200 alloc: [Function], 201 allocUnsafe: [Function], 202 allocUnsafeSlow: [Function], 203 isBuffer: [Function: isBuffer], 204 compare: [Function: compare], 205 isEncoding: [Function], 206 concat: [Function], 207 byteLength: [Function: byteLength] }, 208 clearImmediate: [Function], 209 clearInterval: [Function], 210 clearTimeout: [Function], 211 setImmediate: [Function], 212 setInterval: [Function], 213 setTimeout: [Function], 214 console: [Getter], 215 words: 'test,test' }
看 215行, global对象中存在一个属性: words ; 这是因为我们执行了赋值操作 this.words = words.
--------------------------------------------------------------
如果不执行 this.words = words;
1 //2: 普通函数中的this 2 3 function pet(words) 4 { 5 // this.words = words; 6 7 console.log(this.words); 8 console.log(this === global); 9 console.log(global); 10 } 11 12 pet('test,test');
输出结果:
1 D:\node>node context.js 2 undefined 3 true 4 { DTRACE_NET_SERVER_CONNECTION: [Function], 5 DTRACE_NET_STREAM_END: [Function], 6 DTRACE_HTTP_SERVER_REQUEST: [Function], 7 DTRACE_HTTP_SERVER_RESPONSE: [Function], 8 DTRACE_HTTP_CLIENT_REQUEST: [Function], 9 DTRACE_HTTP_CLIENT_RESPONSE: [Function], 10 COUNTER_NET_SERVER_CONNECTION: [Function], 11 COUNTER_NET_SERVER_CONNECTION_CLOSE: [Function], 12 COUNTER_HTTP_SERVER_REQUEST: [Function], 13 COUNTER_HTTP_SERVER_RESPONSE: [Function], 14 COUNTER_HTTP_CLIENT_REQUEST: [Function], 15 COUNTER_HTTP_CLIENT_RESPONSE: [Function], 16 global: [Circular], 17 process: 18 process { 19 title: 'C:\\WINDOWS\\system32\\cmd.exe - node context.js', 20 version: 'v4.5.0', 21 moduleLoadList: 22 [ 'Binding contextify', 23 'Binding natives', 24 'NativeModule events', 25 'NativeModule buffer', 26 'Binding buffer', 27 'NativeModule internal/util', 28 'Binding util', 29 'NativeModule timers', 30 'Binding timer_wrap', 31 'NativeModule _linklist', 32 'NativeModule assert', 33 'NativeModule util', 34 'Binding uv', 35 'NativeModule path', 36 'NativeModule module', 37 'NativeModule internal/module', 38 'NativeModule vm', 39 'NativeModule fs', 40 'Binding fs', 41 'NativeModule constants', 42 'Binding constants', 43 'NativeModule stream', 44 'NativeModule _stream_readable', 45 'NativeModule _stream_writable', 46 'NativeModule _stream_duplex', 47 'NativeModule _stream_transform', 48 'NativeModule _stream_passthrough', 49 'Binding fs_event_wrap', 50 'NativeModule console', 51 'Binding tty_wrap', 52 'NativeModule tty', 53 'NativeModule net', 54 'NativeModule internal/net', 55 'Binding cares_wrap', 56 'Binding tcp_wrap', 57 'Binding pipe_wrap', 58 'Binding stream_wrap', 59 'Binding signal_wrap' ], 60 versions: 61 { http_parser: '2.7.0', 62 node: '4.5.0', 63 v8: '4.5.103.37', 64 uv: '1.9.1', 65 zlib: '1.2.8', 66 ares: '1.10.1-DEV', 67 icu: '56.1', 68 modules: '46', 69 openssl: '1.0.2h' }, 70 arch: 'x64', 71 platform: 'win32', 72 release: 73 { name: 'node', 74 lts: 'Argon', 75 sourceUrl: 'https://nodejs.org/download/release/v4.5.0/node-v4.5.0.tar.gz', 76 headersUrl: 'https://nodejs.org/download/release/v4.5.0/node-v4.5.0-headers.tar.gz', 77 libUrl: 'https://nodejs.org/download/release/v4.5.0/win-x64/node.lib' }, 78 argv: 79 [ 'D:\\Program Files\\nodejs\\node.exe', 80 'D:\\node\\context.js' ], 81 execArgv: [], 82 env: 83 { ALLUSERSPROFILE: 'C:\\ProgramData', 84 APPDATA: 'C:\\Users\\dc5yy\\AppData\\Roaming', 85 CommonProgramFiles: 'C:\\Program Files\\Common Files', 86 'CommonProgramFiles(x86)': 'C:\\Program Files (x86)\\Common Files', 87 CommonProgramW6432: 'C:\\Program Files\\Common Files', 88 COMPUTERNAME: 'DESKTOP-2I328NT', 89 ComSpec: 'C:\\WINDOWS\\system32\\cmd.exe', 90 configsetroot: 'C:\\WINDOWS\\ConfigSetRoot', 91 FPS_BROWSER_APP_PROFILE_STRING: 'Internet Explorer', 92 FPS_BROWSER_USER_PROFILE_STRING: 'Default', 93 HOMEDRIVE: 'C:', 94 HOMEPATH: '\\Users\\dc5yy', 95 LOCALAPPDATA: 'C:\\Users\\dc5yy\\AppData\\Local', 96 LOGONSERVER: '\\\\DESKTOP-2I328NT', 97 MOZ_PLUGIN_PATH: 'C:\\Program Files (x86)\\Foxit Software\\Foxit Reader\\plugins\\', 98 NUMBER_OF_PROCESSORS: '4', 99 OneDrive: 'C:\\Users\\dc5yy\\OneDrive', 100 OS: 'Windows_NT', 101 Path: 'C:\\Program Files (x86)\\Intel\\iCLS Client\\;C:\\Program Files\\Intel\\iCLS Client\\;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\IPT;D:\\Program Files\\TortoiseSVN\\bin;C:\\Program Files (x86)\\VisualSVN Server\\bin;D:\\Program Files\\nodejs\\;C:\\Users\\dc5yy\\AppData\\Roaming\\npm;C:\\Users\\dc5yy\\AppData\\Local\\Microsoft\\WindowsApps;D:\\xampp\\apache\\bin', 102 PATHEXT: '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 103 PROCESSOR_ARCHITECTURE: 'AMD64', 104 PROCESSOR_IDENTIFIER: 'Intel64 Family 6 Model 60 Stepping 3, GenuineIntel', 105 PROCESSOR_LEVEL: '6', 106 PROCESSOR_REVISION: '3c03', 107 ProgramData: 'C:\\ProgramData', 108 ProgramFiles: 'C:\\Program Files', 109 'ProgramFiles(x86)': 'C:\\Program Files (x86)', 110 ProgramW6432: 'C:\\Program Files', 111 PROMPT: '$P$G', 112 PSModulePath: 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules', 113 PUBLIC: 'C:\\Users\\Public', 114 SESSIONNAME: 'Console', 115 SystemDrive: 'C:', 116 SystemRoot: 'C:\\WINDOWS', 117 TEMP: 'C:\\Users\\dc5yy\\AppData\\Local\\Temp', 118 TMP: 'C:\\Users\\dc5yy\\AppData\\Local\\Temp', 119 USERDOMAIN: 'DESKTOP-2I328NT', 120 USERDOMAIN_ROAMINGPROFILE: 'DESKTOP-2I328NT', 121 USERNAME: 'admin', 122 USERPROFILE: 'C:\\Users\\dc5yy', 123 VISUALSVN_SERVER: 'C:\\Program Files (x86)\\VisualSVN Server\\', 124 windir: 'C:\\WINDOWS' }, 125 pid: 3864, 126 features: 127 { debug: false, 128 uv: true, 129 ipv6: true, 130 tls_npn: true, 131 tls_sni: true, 132 tls_ocsp: true, 133 tls: true }, 134 _needImmediateCallback: false, 135 execPath: 'D:\\Program Files\\nodejs\\node.exe', 136 debugPort: 5858, 137 _startProfilerIdleNotifier: [Function: _startProfilerIdleNotifier], 138 _stopProfilerIdleNotifier: [Function: _stopProfilerIdleNotifier], 139 _getActiveRequests: [Function: _getActiveRequests], 140 _getActiveHandles: [Function: _getActiveHandles], 141 reallyExit: [Function: reallyExit], 142 abort: [Function: abort], 143 chdir: [Function: chdir], 144 cwd: [Function: cwd], 145 umask: [Function: umask], 146 _kill: [Function: _kill], 147 _debugProcess: [Function: _debugProcess], 148 _debugPause: [Function: _debugPause], 149 _debugEnd: [Function: _debugEnd], 150 hrtime: [Function: hrtime], 151 dlopen: [Function: dlopen], 152 uptime: [Function: uptime], 153 memoryUsage: [Function: memoryUsage], 154 binding: [Function: binding], 155 _linkedBinding: [Function: _linkedBinding], 156 _setupDomainUse: [Function: _setupDomainUse], 157 _events: 158 { newListener: [Function], 159 removeListener: [Function], 160 SIGWINCH: [Object] }, 161 _rawDebug: [Function], 162 _eventsCount: 3, 163 domain: null, 164 _maxListeners: undefined, 165 EventEmitter: 166 { [Function: EventEmitter] 167 EventEmitter: [Circular], 168 usingDomains: false, 169 defaultMaxListeners: 10, 170 init: [Function], 171 listenerCount: [Function] }, 172 _fatalException: [Function], 173 _exiting: false, 174 assert: [Function], 175 config: { target_defaults: [Object], variables: [Object] }, 176 nextTick: [Function: nextTick], 177 _tickCallback: [Function: _tickCallback], 178 _tickDomainCallback: [Function: _tickDomainCallback], 179 stdout: [Getter], 180 stderr: [Getter], 181 stdin: [Getter], 182 openStdin: [Function], 183 exit: [Function], 184 kill: [Function], 185 mainModule: 186 Module { 187 id: '.', 188 exports: {}, 189 parent: null, 190 filename: 'D:\\node\\context.js', 191 loaded: false, 192 children: [], 193 paths: [Object] } }, 194 GLOBAL: [Circular], 195 root: [Circular], 196 Buffer: 197 { [Function: Buffer] 198 poolSize: 8192, 199 from: [Function], 200 alloc: [Function], 201 allocUnsafe: [Function], 202 allocUnsafeSlow: [Function], 203 isBuffer: [Function: isBuffer], 204 compare: [Function: compare], 205 isEncoding: [Function], 206 concat: [Function], 207 byteLength: [Function: byteLength] }, 208 clearImmediate: [Function], 209 clearInterval: [Function], 210 clearTimeout: [Function], 211 setImmediate: [Function], 212 setInterval: [Function], 213 setTimeout: [Function], 214 console: [Getter] } 215 216 D:\node>
可见,此时 global对象中没有 words属性, 因此 输出 this.words 是 undefined.
--------------------------------------
3. 情况三: 构造函数中的this .
1 //3: 构造函数中的this 2 3 function Pet(words) 4 { 5 this.words = words; 6 this.speak = function(){ 7 console.log(this.words); 8 console.log(this); 9 console.log(this === cat); 10 } 11 } 12 13 var cat = new Pet("miao,miao"); 14 cat.speak();
构造函数中的this 指的是 这个构造函数的 一个 实例.
4: 通过 call 改变一个 函数中的this 的指代.
4-1: 字面量对象:
1 //1: call : 改变一个函数中的this的指代: 2 3 var pet = { 4 words: '...', 5 speak: function(say){ 6 console.log(say + ' ' + this.words); 7 } 8 }; 9 10 pet.speak('Speak'); 11 12 var dog = { 13 words: 'wang,wang' 14 }; 15 16 pet.speak.call(dog, 'dog speaks'); 17 18 console.log(dog); 19 20 pet.speak('pet speak again');
运行:
pet.speak.call(dog, 'dog speaks');
显然:
1. dog 对象 没有 speak方法, 如果使用 dog.speak()报错.
2.pet.speak.call(dog, 'dog speaks');
这句话的意思是 pet.speak 方法 的 this 指代发生变更, 从 pet 对象, 改为 dog 对象;
同时 'dog speaks' 是给 pet.speak方法传递的参数.
3. 这里 pet.speak.call(dog, 'dog speaks'); 是 一次性的.
3-1: 从第 20行 ,可以看出this 又 指向了pet对象.
3-2: 从 18行可以看出, 使用call 将 pet.speak 中的this改变,从pet对象改为 dog 对象后.
dog对象 自己 并没有 增加 speak 方法.
仅仅只是 对象 可以 通过 call 调用 其他对象的方法, 同时将该方法中的this 指代 自己.
格式: 其他对象 . 方法 . call(当前对象, 传递给方法的参数);
------------------------------------------
1 //1: call : 改变一个函数中的this的指代: 2 3 var pet = { 4 words: '...', 5 speak: function(say){ 6 console.log(say + ' ' + this.words); 7 console.log(this === dog); 8 } 9 }; 10 11 pet.speak('Speak'); 12 13 var dog = { 14 words: 'wang,wang' 15 }; 16 // dog.speak('dog, dog'); 17 pet.speak.call(dog, 'dog speaks'); 18 19 console.log(dog); 20 21 // pet.speak('pet speak again');
4-2: 构造函数:
1 //1: call : 改变一个函数中的this的指代: 2 3 //1-1: 字面量对象: 4 // var pet = { 5 // words: '...', 6 // speak: function(say){ 7 // console.log(say + ' ' + this.words); 8 // console.log(this === dog); 9 // } 10 // }; 11 12 // pet.speak('Speak'); 13 14 // var dog = { 15 // words: 'wang,wang' 16 // }; 17 // // dog.speak('dog, dog'); 18 // pet.speak.call(dog, 'dog speaks'); 19 20 // console.log(dog); 21 22 // pet.speak('pet speak again'); 23 24 //1-2: 构造函数 25 function Pet(words){ 26 this.words = words; 27 this.speak = function(say){ 28 console.log(say + ' : '+ this.words); 29 console.log(this === dog01); 30 }; 31 } 32 33 var pet01 = new Pet('this is pet'); 34 pet01.speak('pet speak'); 35 36 function Dog(words){ 37 this.words = words; 38 } 39 40 var dog01 = new Dog('this is dog'); 41 42 pet01.speak.call(dog01, 'dog speak'); 43 console.log(dog01);
5. 通过 call 实现继承.
1 //2: call: 实现继承: 2 3 4 function Pet(words, age){ 5 this.words = words; 6 this.age = age; 7 this.speak = function(say){ 8 console.log(say + ' : '+ this.words); 9 }; 10 } 11 12 var pet = new Pet('this is pet', '4'); 13 pet.speak('pet speaks'); 14 console.log(pet); 15 16 function Dog(words, age, color){ 17 this.color = color; 18 Pet.call(this, words, age); 19 // Pet.apply(this, [words, age]); 20 } 21 22 var dog = new Dog("this is dog", 2, 'yellow'); 23 dog.speak('dog speaks'); 24 console.log(dog);
运行:
注意:
1.Pet.call(this, words, age); 格式是 : 其他构造函数(被继承的构造函数) . call (this当前构造函数, 传递给 被继承的构造函数的参数).
2. call 和 apply的区别是 call 的参数是字符串, 多个, ; apply的参数是 一个数组.
3.通过 被继承构造函数 . call (继承的构造函数, 参数) 后 ,
继承的构造函数 就会 具有 被继承的构造函数中的 属性 和 方法.
参考链接: