面向对象之对象,作用域及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面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...
随机推荐
- matlab之waitbar() delete() close()
matlab之waitbar() delete() close() 三者之间的关系: 在显示某个程序的进度时,用waitbar函数显示进度条,当程序进行完毕时,用close 或 delete函数关闭此 ...
- __set(),__get() 魔术方法示例
<?php class Ren{private $name;private $age;private $sex;function __set($name,$value){ if($name == ...
- userdate和table类型的效率对比
做cocos2d-x开发的人可能有不少人在实现类时会利用cocos2d-x自己给出的类的实现,也即在luaBinding目录下extern.lua的文件中给出的实现: --Create an clas ...
- [Effective JavaScript 笔记]第23条:永远不要修改arguments对象
arguments对象并不是标准的Array类型的实例.arguments对象不能直接调用Array方法. arguments对象的救星call方法 使得arguments可以品尝到数组方法的美味,知 ...
- 解决港版A1530 ios8 联通4G 电话打不进无法接通的问题,联通4G开关开启方法
GF的iPhone5s港版A1530联通4G老是出现无法接通的问题, 根本原因是没有4G开关.港行iPhone却只有3G开关.也就是说,当启动3G时,却搜到4G信号,但是关闭时却只能关闭3G和2G.让 ...
- MYSQL随机抽取查询 MySQL Order By Rand()效率问题
MYSQL随机抽取查询:MySQL Order By Rand()效率问题一直是开发人员的常见问题,俺们不是DBA,没有那么牛B,所只能慢慢研究咯,最近由于项目问题,需要大概研究了一下MYSQL的随机 ...
- java 异常处理 Throwable Error 和Exception
Java异常类层次结构图: 异常的英文单词是exception,字面翻译就是“意外.例外”的意思,也就是非正常情况.事实上,异常本质上是程序上的错误,包括程序逻辑错误和系统错误. 比如使用 ...
- Shell编程基础
写之前我们先来搞清楚为什么要学shell,学习要有目的性shell简单.灵活.高效,特别适合处理一些系统管理方面的小问题shell可以实现自动化管理,让系统管理员的工作变得容易.简单.高效shell脚 ...
- sphinx 增量索引与主索引使用测试
2013年10月28日 15:01:16 首先对新增的商品建立增量索引,搜索时只使用增量索引: array (size=1) 0 => array (size=6) 'gid' => st ...
- jQuery操作复选框的简单使用
开发中为了实现一个小功能,就是复选框的相互影响事件,如下图: 就是通过复选框设置权限,权限是分等级的,这是一个web管理系统的应用,一个管理员具有三个权限赋予,权限也是有等级的,其中删除和编辑权限相当 ...