面向对象之对象,作用域及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面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...
随机推荐
- Todd's Matlab讲义第1讲:向量,函数和作图
向量 Matlab 中最基本的对象是矩阵,向量是特殊的矩阵.行向量是\(1\times n\)矩阵,列向量是\(m\times 1\)矩阵.输入如下行向量: >> v=[0 1 2 3] ...
- java的一段对象数据类型映射的代码
try { List<GateMetaPO> listGateInfoPO = majorGateReaderService.queryForAggregateBy( chapter); ...
- 使用python一步一步搭建微信公众平台(一)
使用的工具,python 新浪SAE平台,微信的公众平台 你需要先在微信的公众平台与新浪SAE平台上各种注册,微信平台注册的时候需要你拍张手持身份证的照片,还有几天的审核期 微信公众平台:http:/ ...
- VS2010调用Com组件
Com组件开发过程中用的不多,资料也不多,故记录开发Com组件中的部分问题. 在这一篇文章里,讲解了如何使用VS2010创建Com组件.现在基于该文章创建的Com组件接口,创建VC++项目来调用该接口 ...
- 电够动力足——认识主板上的CPU供电模块
CPU供电模块有啥用 CPU供电模块从字面上理解,就是专给CPU供电的一个电子元器件组合.因为CPU工作时就跟发动机一样,油(电)提供得稳不稳定.品质高不高就是CPU供电模块干的事情.反过来说,如果C ...
- NOIP 2011 Day 1 部分题解 (Prob#1 and Prob#2)
Problem 1: 铺地毯 乍一看吓cry,地毯覆盖...好像是2-dims 线段树,刚开头就这么难,再一看,只要求求出一个点,果断水题,模拟即可.(注意从标号大的往小的枚举,只要有一块地毯符合要求 ...
- mysql如何设置密码
1.用root 进入mysql后mysql>set password =password('你的密码');mysql>flush privileges;2.使用GRANT语句 mysql& ...
- 【OpenStack】OpenStack系列3之Swift详解
Swift安装部署(与keystone依赖包有冲突,需要安装不同版本eventlet) 参考:http://www.server110.com/openstack/201402/6662.html h ...
- 《转》IIS中配置通配符应用程序映射
本文转载自龚赤兵 电子工业出版社,如给您带来不便之处,请联系博主. eb开发新体验:ASP.NET 3.5 MVC架构与实战>第13章网站部署,本章主要实现了如何在IIS 6.0中一步一步地成功 ...
- GPL协议的MySQL数据库
网络上多数朋友担心甲骨文会对MySQL软件采用收费模式,多数朋友也不清楚MySQL开源到底是什么模式,开源=免费嘛?是很多的疑问?MySQL是遵守双重协议的,一个是GPL授权协议,一个是商用授权协议( ...