面向对象之对象,作用域及this
object eg: var o = { a : 2, b : 3 }; console.log(o); console.log(typeof o); console.log(o.a.toFixed(2)); ==> var o = new Object(); o.a = 2; o.b = 3; console.log(o); console.log(typeof o); console.log(o.a.toFixed(2)); eg: var person = { name: “张三”, age: 26, gender: “男”, eat: function( stuff ) { alert( “我在吃” + stuff ); } }; person.height = 176; delete person[ “age” ]; 使用函数构造器构造对象 每个构造器实际上是一个 函数(function) 对象, 该函数对象含有一个“prototype”属性用于实现 基于原型的继承(prototype-based inheritance)和 共享属性(shared properties)。对象可以由“new 关键字 + 构造器调用”的方式来创建 // 构造器 Person 本身是一个函数对象 function Person() { // 此处可做一些初始化工作 } // 它有一个名叫 prototype 的属性 Person.prototype = { name: “张三”, age: 26, gender: “男”, eat: function( stuff ) { alert( “我在吃” + stuff ); } } // 使用 new 关键字构造对象 var p = new Person();
scope eg0: var authorName="山边小溪"; function doSomething(){ var blogName="梦想天空"; blogTitle="面向对象"; function innerSay(){ alert(blogName); } innerSay(); } doSomething(); innerSay(); eg1: function foo(){ function bar(a){ i = 3; console.log(a+i); } for(var i=0; i<10 ; i++){ bar( i*2) ; } } foo(); eg2: var a = 2; var obj = { a : 4 }; (function foo(that){ var a = 3; console.log(a); console.log(this.a); console.log(that.a); })(obj); foo(); //eval() function foo(str,a){ eval(str); console.log(a,b); } var b = 2; foo("var b = 3;",1); //with() function foo(obj){ with(obj){ a = 2; } } var o1 = { a = 3; } var o2 = { b = 3; } foo(o1); console.log(o1.a); foo(o2); console.log(o2.a); console.log(a); //let与var foo(); function foo(){ console.log(q); var q=1; } foo(); function foo(){ console.log(q); let q=1; } //变量提升 foo(); bar(); var foo = function bar(){ .. } => var foo; foo(); bar(); foo = function(){ var bar=...self... .. } 引擎会在解释js代码之前首先对其进行编译,而编译的一部分工作就是找到所有的声明,并用合适的作用域将它们关联起来。 ——> 包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理。 ——> 声明提升赋值和其他运逻辑会留在原地 ——> 函数表达式,包括具名函数表达式不会被提升 ——> 函数先提升,然后才是变量 eg3: name = 'a'; function test(){ var name = 'b'; function local1(){ var name = 'c'; console.log(name); } function local2(){ console.log(name); } local1(); local2(); } test();
this eg1: function a(){//当前调用栈是a,因此a的调用位置是全局作用域 console.log('a'); b();// b的调用位置 } function b(){//当前调用栈是a->b,因此a的调用位置是a console.log('b'); c();// c的调用位置 } function c(){//当前调用栈是a->b->c,因此a的调用位置是b console.log('c'); } a(); // a的调用位置 debugger;调试工具中分析call stack eg2: function foo(){ console.log(this.a); } var a = 2; foo(); function foo(){ 'use strict' console.log(this.a); } var a = 2; foo(); eg3: function test(){ console.log(this.a); } var obj = { a: 2, test :test } obj.test(); eg4: function foo(){ console.log(this.a); } var obj ={ a:2, foo:foo } var bar = obj.foo; var a = 3; bar(); eg: var x = 2; function test() { this.x = 1; } var b = new test(); alert("b.x: " + b.x); b.x = 3; test(); x*=10; alert("b.x: " + b.x); alert("x: " + x); var b = {}; b.x = 4; b.test = test; b.test(); alert("b.x: " + b.x); var b = {}; b.x = 4; b.test = test; x += 5; b.test.apply(); alert("b.x: " + b.x); alert("x: " + x); var b = {}; b.x = 4; b.test = test; x += 5; b.test.apply(b) alert("b.x: " + b.x); alert("x: " + x); eg: var name = "I am window"; var obj = { name:"xiaoming", job:"software", ftn01:function(obj){ obj.show(); }, ftn02:function(ftn){ ftn(); }, ftn03:function(ftn){ ftn.call(this); } }; function Person(name){ this.name = name; this.show = function(){ console.log("姓名:" + this.name); console.log(this); } } var p = new Person("Person"); obj.ftn01(p); obj.ftn02(function(){ console.log(this.name); console.log(this); }); obj.ftn03(function(){ console.log(this.name); console.log(this); });
情形一:传入的参数是函数的别名,那么函数的this就是指向window;
情形二:传入的参数是被new过的构造函数,那么this就是指向实例化的对象本身;
情形三:如果我们想把被传入的函数对象里this的指针指向外部字面量定义的对象,那么我们就是用apply和call
如果在javascript语言里没有通过new(包括对象字面量定义)、call和apply改变函数的this指针,函数的this指针都是指向window的
面向对象之对象,作用域及this的更多相关文章
- Spring实现Ioc的多种方式--控制反转、依赖注入、xml配置的方式实现IoC、对象作用域
Spring实现Ioc的多种方式 一.IoC基础 1.1.概念: 1.IoC 控制反转(Inversion of Control) IoC是一种设计思想. 2.DI 依赖注入 依赖注入是实现IoC的一 ...
- JavaWeb chapter6 对象作用域
1. 对象属性所在作用域:谁能看到并使用这个属性,以及它能存活多久. 2. 应用上下文ServletContext对象作用域: 对于整个Web应用,只有一个ServletContext对象,而且在 ...
- Java面向对象 其他对象
Java面向对象 其他对象 知识概要: (1)可变参数 (2)静态导入 (3)System (4)Runtime (5)Date Calendar (6)Math 本 ...
- 跨JavaScript对象作用域调用setInterval方法
跨JavaScript对象作用域调用setInterval方法: var id = window.setInterval(function() {foofunc.call(this);}, 200);
- [PHP]获取静态方法调用者的类名和运用call_user_func_array代入对象作用域
一.获取静态方法调用者的类名 方法一: class foo { static public function test() { var_dump(get_called_class()); } } cl ...
- 洗礼灵魂,修炼python(31)--面向对象编程(1)—面向对象,对象,类的了解
面向对象 1.什么是面向对象 (图片来自网络) 哈哈,当然不是图中的意思. 1).面向对象(Object Oriented,OO)是软件开发方法.利用各大搜索引擎得到的解释都太官方,完全看不懂啥意思对 ...
- 第六章 对象作用域与servlet事件监听器
作用域对象 Servlet上下文监听器 Servlet会话监听器 Servlet请求监听器 一:对象作用域 作用域对象 属性操作方法 作用域范围说明 ServletContext( ...
- day22:面向对象封装对象操作&类操作&面向对象删除操作
面向对象程序开发 1.类的三种定义方式 class MyClass: pass class MyClass(): #(推荐) pass class MyClass(object): # object类 ...
- js面向对象学习 - 对象概念及创建对象
原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...
随机推荐
- <转载>NPOI Excel 单元格背景颜色对照表
我转载地址:http://www.holdcode.com/web/details/117 NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 ...
- Window_搭建SVN服务器
http://wenku.baidu.com/link?url=614FLi_VlhiJpyG5bq8JcwFBHroMjsV3FvBDzyyn0snZ85jbWx7xh-RPJdH7stxlgM9i ...
- node.js模拟qq漂流瓶
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) node.js模拟简易漂流瓶,页面有扔瓶子和捡瓶子的功能,一个瓶子只能被捡到一次,阅读完就置状态位, ...
- [UOJ#34]多项式乘法
[UOJ#34]多项式乘法 试题描述 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入 第一行两个整数 n 和 m,分别表示两个多项式的次数. 第二行 n+1 个整数,分别表示第一个多 ...
- nginx学习(二):初识配置文件
nginx的配置文件默认在nginx安装目录中的conf子目录中,主配置文件为nginx.conf, root@mgmserver conf]# pwd/usr/local/nginx/conf一.配 ...
- 2015安徽省赛 A.First Blood
题目描述 盖伦是个小学一年级的学生,在一次数学课的时候,老师给他们出了一个难题: 老师给了一个正整数 n,需要在不大于n的范围内选择三个正整数(可以是相同的),使它们三个的最小公倍数尽可能的大.盖伦很 ...
- Python os.system 和 os.popen的区别
(1) os.system # 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 system(command) -> exit_statusExecute the command ...
- CH round #55 Streaming #6
T^T Saffah大神照样刷我这样诚心诚意想做一套NOIP模拟题的蒟蒻. 第一题 九九归一 好diao的名字... 题意就是给定一队$n,q$,求在模$n$意义下一个数$x$自乘的循环节长度. 当$ ...
- python时间转换
#设a为字符串 import time a = "2011-09-28 10:00:00" #中间过程,一般都需要将字符串转化为时间数组 time.strptime(a,'%Y-% ...
- Google Code Jam 2014 Round 1B Problem B
二进制数位DP,涉及到数字的按位与操作. 查看官方解题报告 #include <cstdio> #include <cstdlib> #include <cstring& ...