js对象私有变量公有变量问题

0

js对象私有变量公有变量问题5

小弟初学JS面向对象编程 现有一问题 请教各位大虾:
Person=function (){

//私有变量定义

var name;

vae age;

var Alert=function (){ alert(name+age);};

return {

printName:function(){  alert(this.Alert());},

printAge:function(){alert(thia.age);}

}

}

外部调用 Person person1=new Person();

person1.name="张三";

person1.age=20;

person1.printAge();//成功没有错误

person1.printName();//报错

请各位指点为什么在公有方法里 用this调私有变量都可以 调私有方法都出错?


问题补充:

langshao 写道

Javascript代码  

  1. function WhoAmI() //定义一个函数WhoAmI
  2. {
  3. alert("I‘m " + this.name + " of " + typeof(this));
  4. };
  5. WhoAmI(); //此时是this 当前这段代码的全局对象,在浏览器中就是window 对象,其name 属性为空字符串。
  6. 输出:I‘m of object
  7. var BillGates = {name: "Bill Gates"};
  8. BillGates.WhoAmI = WhoAmI; //将函数WhoAmI 作为BillGates 的方法。
  9. BillGates.WhoAmI(); //此时的this 是BillGates。输出:I‘m Bill Gates of object
  10. var SteveJobs = {name: "Steve Jobs"};
  11. SteveJobs.WhoAmI = WhoAmI; //将函数WhoAmI 作为SteveJobs 的方法。
  12. SteveJobs.WhoAmI(); //此时的this 是SteveJobs。输出:I‘m Steve Jobs of object
  13. WhoAmI.call(BillGates); //直接将BillGates 作为this,调用WhoAmI。输出:I‘m Bill Gates of object
  14. WhoAmI.call(SteveJobs); //直接将SteveJobs 作为this,调用WhoAmI。输出:I‘m Steve Jobs of object
  15. 8
  16. BillGates.WhoAmI.call(SteveJobs); //将SteveJobs 作为this,却调用BillGates 的WhoAmI 方法。输出:
  17. I‘m Steve Jobs of object
  18. SteveJobs.WhoAmI.call(BillGates); //将BillGates 作为this,却调用SteveJobs 的WhoAmI 方法。输出:
  19. I‘m Bill Gates of object
  20. WhoAmI.WhoAmI = WhoAmI; //将WhoAmI 函数设置为自身的方法。
  21. WhoAmI.name = "WhoAmI";
  22. WhoAmI.WhoAmI(); //此时的this 是WhoAmI 函数自己。输出:I‘m WhoAmI of function
  23. ({name: "nobody", WhoAmI: WhoAmI}).WhoAmI(); //临时创建一个匿名对象并设置属性后调用WhoAmI
  24. 方法。输出:I‘m nobody of object

谢谢你 答复的很详细 太感谢了。。。你有QQ吗可以加一下吗 以后向你请教

JavaScript

2010年2月06日 23:12


Wanghuidong

18

0
0
1

2个答案
按时间排序
按投票排序

0
0

采纳的答案

Javascript代码  

  1. function WhoAmI() //定义一个函数WhoAmI
  2. {
  3. alert("I‘m " + this.name + " of " + typeof(this));
  4. };
  5. WhoAmI(); //此时是this 当前这段代码的全局对象,在浏览器中就是window 对象,其name 属性为空字符串。
  6. 输出:I‘m of object
  7. var BillGates = {name: "Bill Gates"};
  8. BillGates.WhoAmI = WhoAmI; //将函数WhoAmI 作为BillGates 的方法。
  9. BillGates.WhoAmI(); //此时的this 是BillGates。输出:I‘m Bill Gates of object
  10. var SteveJobs = {name: "Steve Jobs"};
  11. SteveJobs.WhoAmI = WhoAmI; //将函数WhoAmI 作为SteveJobs 的方法。
  12. SteveJobs.WhoAmI(); //此时的this 是SteveJobs。输出:I‘m Steve Jobs of object
  13. WhoAmI.call(BillGates); //直接将BillGates 作为this,调用WhoAmI。输出:I‘m Bill Gates of object
  14. WhoAmI.call(SteveJobs); //直接将SteveJobs 作为this,调用WhoAmI。输出:I‘m Steve Jobs of object
  15. 8
  16. BillGates.WhoAmI.call(SteveJobs); //将SteveJobs 作为this,却调用BillGates 的WhoAmI 方法。输出:
  17. I‘m Steve Jobs of object
  18. SteveJobs.WhoAmI.call(BillGates); //将BillGates 作为this,却调用SteveJobs 的WhoAmI 方法。输出:
  19. I‘m Bill Gates of object
  20. WhoAmI.WhoAmI = WhoAmI; //将WhoAmI 函数设置为自身的方法。
  21. WhoAmI.name = "WhoAmI";
  22. WhoAmI.WhoAmI(); //此时的this 是WhoAmI 函数自己。输出:I‘m WhoAmI of function
  23. ({name: "nobody", WhoAmI: WhoAmI}).WhoAmI(); //临时创建一个匿名对象并设置属性后调用WhoAmI
  24. 方法。输出:I‘m nobody of object

2010年2月07日 10:22


langshao

938

0
0
0

0
0

Javascript代码  

  1. Person = function() {
  2. return {
  3. printName: function() { this.Alert.call(this); },
  4. printAge: function() { alert(this.age); }
  5. }
  6. }
  7. function process() {
  8. //外部调用
  9. person1 = new Person();
  10. person1.name="张三";
  11. person1.age=20;
  12. person1.Alert = function() { alert(this.name + this.age); };
  13. person1.printAge();
  14. person1.printName();
  15. }
时间: 2024-10-13 12:06:53

js对象私有变量公有变量问题的相关文章

007-Scala类的属性和对象私有字段实战详解

007-Scala类的属性和对象私有字段实战详解 Scala类的使用实战 变量里的类必须赋初值 def函数时如果没参数可不带括号 2.不需要加Public声明 getter与setter实战 getter方法:def age setter方法:def age_ var 变量默认生成getter和setter方法 val默认只生成getter方法 对象私有属性实战 变量声明为private后这个变量只能在这个类的内部使用 private[this]对象私有属性 这个类自己的方法只能访问自己的对象的

JS中的 公有变量、私有变量 !

公有变量.私有变量 ! 初学者的见解,算是记录学习过程,也算是分享以便共同成长,如有不正确的地方,还请不吝赐教! 先看代码1: function car(){ var wheel = 3; //私有变量 this.wheel = 4; //公有变量 alert(wheel); alert(this.wheel); } var car1 = new car();结果是:3 4 代码2: function car(){ var wheel = 3;//私有变量 this.wheel = 4;//公有

js的命名空间 && 单体模式 && 变量深拷贝和浅拷贝 && 页面弹窗设计

说在前面:这是我近期开发或者看书遇到的一些点,觉得还是蛮重要的. 一.为你的 JavaScript 对象提供命名空间 <!DOCTYPE html> <html> <head> <title>为自己的js对象提供命名空间</title> </head> <body> <div>封装自己的数据和函数,防止和其他的库搞混了</div> <script> var jscbObject = {

js 作用域链&amp;内存回收&amp;变量&amp;闭包

闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等 一.作用域链:函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引,而他内部的规则是,把函数自身的本地变量放在最前面,把自身的父级函数中的变量放在其次,把再高一级函数中的变量放在更后面,以此类推直至全局对象为止.当函数中需要查询一个变量的值的时候,js解释器会去作用域链去查找,从最前面的本地变量中先找,如果没有找到对应的变量,则到下一级的链上找,一旦找到了变量,则不再继续.如果找到最后也没找到需要的变量,则

js的变量,变量作用域,作用域链

变量声明: 使用var关键字声明,如果使用没有声明的变量,则JS会自动声明此变量根据变量作用域.如果变量只声明为赋值,则此时值是undefined.重复声明变量,在JS不会报错,会依据最后一次的声明来处理变量. 变量作用域: 一个变量的作用域是,程序代码定义这个变量的区域,全局变量在程序代码内任何地方都可以访问. 包括在{}函数,对象内的变量(属性)成为局部变量. 在函数体内定义的变量成为局部变量,作用域也是局部,函数参数也是局部变量. 他们只在函数体内有意义. 在函数体内,局部变量优先于全局变

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承.(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承. 分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量

福利-&gt;KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型

我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型. 废话不多说,直接上代码: 1.工具类(其实就是NSObject的一个分类)头文件 1 #import <Foundation/Foundation.h> 2 3 @interface NSObject (YSRuntime) 4 5 /** 6 返回当前类的属性数组 7 8 @return 属

js技术1-js简介和变量

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>JavaScript简介</title> <!-- 作者:[email protected] 时间:2017-03-28 描述:使用JS的三种方式: 1.html标签中内嵌js <button onclick="javascript:alert('你真点我啊')"&g

JS基础知识回顾:变量、作用域和内存问题

ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型值指的是简单的数据段,而引用类型值指的是那些可能由多个值构成的对象. 引用类型的值是保存在内存中的对象,与其他语言不同,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间. 在操作对象时,实际上是在操作对象的引用而不是实际的对象. 在很多语言中,字符串以对象的形式来表示,因此被认为是引用类型的,ECMAScript放弃了这一传统. 定义基本类型值和引用类型值的方式是类似的:创建