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的更多相关文章

  1. Spring实现Ioc的多种方式--控制反转、依赖注入、xml配置的方式实现IoC、对象作用域

    Spring实现Ioc的多种方式 一.IoC基础 1.1.概念: 1.IoC 控制反转(Inversion of Control) IoC是一种设计思想. 2.DI 依赖注入 依赖注入是实现IoC的一 ...

  2. JavaWeb chapter6 对象作用域

    1.  对象属性所在作用域:谁能看到并使用这个属性,以及它能存活多久. 2.  应用上下文ServletContext对象作用域: 对于整个Web应用,只有一个ServletContext对象,而且在 ...

  3. Java面向对象 其他对象

     Java面向对象  其他对象 知识概要:             (1)可变参数 (2)静态导入 (3)System (4)Runtime (5)Date  Calendar (6)Math 本 ...

  4. 跨JavaScript对象作用域调用setInterval方法

    跨JavaScript对象作用域调用setInterval方法: var id = window.setInterval(function() {foofunc.call(this);}, 200);

  5. [PHP]获取静态方法调用者的类名和运用call_user_func_array代入对象作用域

    一.获取静态方法调用者的类名 方法一: class foo { static public function test() { var_dump(get_called_class()); } } cl ...

  6. 洗礼灵魂,修炼python(31)--面向对象编程(1)—面向对象,对象,类的了解

    面向对象 1.什么是面向对象 (图片来自网络) 哈哈,当然不是图中的意思. 1).面向对象(Object Oriented,OO)是软件开发方法.利用各大搜索引擎得到的解释都太官方,完全看不懂啥意思对 ...

  7. 第六章 对象作用域与servlet事件监听器

          作用域对象 Servlet上下文监听器 Servlet会话监听器 Servlet请求监听器     一:对象作用域 作用域对象 属性操作方法 作用域范围说明 ServletContext( ...

  8. day22:面向对象封装对象操作&类操作&面向对象删除操作

    面向对象程序开发 1.类的三种定义方式 class MyClass: pass class MyClass(): #(推荐) pass class MyClass(object): # object类 ...

  9. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

随机推荐

  1. chrome 调试基本信息学习

    学习链接: remote-debugging-port相关: http://blog.chromium.org/2011/05/remote-debugging-with-chrome-develop ...

  2. spring原理

    1.spring框架什么时候被加载? (1)ApplicationContext ac = new ClassPathXmlApplicationContext("applicationCo ...

  3. 7 Types of Regression Techniques you should know!

    翻译来自:http://news.csdn.net/article_preview.html?preview=1&reload=1&arcid=2825492 摘要:本文解释了回归分析 ...

  4. PLY文件(转)

    转载:http://bbs.itiankong.com/thread-89555-1-1.html PLY 是一种电脑档案格式,全名为 多边形档案(Polygon File Format) 或 史丹佛 ...

  5. HDOJ 1856

    #include<cstdio> #include<cstdlib> typedef struct ufse *ufset; struct ufse { ]; ]; }UFS; ...

  6. js中的闭包之我理解

    闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的 ...

  7. php数组转换js数组操作及json_encode应用

    对于php,个人感觉能够熟练操作数组和字符串,基本上已经是入门了,php本身有很多操作数组和字符串的函数,今天在做一个功能时,需要用Js动态的创建门店信息,这些信息是要从后台添加的,想来想去,通过ph ...

  8. What is the difference between provider network and self-service network in OpenStack?

    "self-service networking" allows users to create their own virtual networks, subnets, rout ...

  9. 【OpenStack】OpenStack系列16之OpenStack镜像制作

    参考 参考: https://www.google.com.hk/?gws_rd=ssl#safe=strict&q=openstack+img+%E5%88%B6%E4%BD%9C http ...

  10. JSON: property "xxx" has no getter method in class "..."

    Exception in thread "main" net.sf.json.JSONException: java.lang.NoSuchMethodException: Pro ...