学习Javascript,最难的地方是什么?
Object(对象)最难,初学者不容易掌握。
Javascript是一种基于对象(object-based)的语言,它的语法中没有class(类)。
C#面向对象基础
1、类是数据封装的基本单位,是重复使用的最小单位。
类的成员:变量、方法、属性、事件、常数
对象是类在内存中的实体,类用于描述对象在内存中的数据。
2、静态方法可以不建立类的对象,即不用new实例化,而用类直接调用:类名.方法名()
Static变量通常用于配置全局共用的区块
3、new实例化对象后,对象将会被配置在堆积Heap中,堆栈Stack内保存的是指向堆积Heap中对象所在位置的参考指针。实例化的那个对象用于存放的是指针。
4、this操作数
this操作数是指向此对象的参考指针。也就是实例化后就可以使用this来存取这一对象实体。还可以用于解决名称相同的问题:this.Name=Name(参数)。this还可以用来返回目前对象的参考: this.Name=Name ;return this。
Javascript面向对象基础
Javascript定义类(class)的三种方法
一、构造函数
内部用this关键字指代实例对象。
function Class() {
this.name = "名称";
}
类的属性和方法,还可以定义在构造函数的prototype对象之上,Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。
Class.prototype.pwd = function () {
alert("密码");
}
生成实例的时候,使用new关键字。
var obj = new Class();
alert(obj.name); // 名称
alert(obj.pwd); // 密码
Prototype模式的验证方法
1.isPrototypeOf()
这个方法用来判断,某个proptotype对象和某个实例之间的关系。
alert(Class.prototype.isPrototypeOf(obj)); //true
2.hasOwnProperty()
每个实例对象都有一个hasOwnProperty()方法,用来判断某一个属性到底是本地属性,还是继承自prototype对象的属性。
alert(obj.hasOwnProperty("name")); // true
3.in运算符
in运算符可以用来判断,某个实例是否含有某个属性,不管是不是本地属性。
alert("name" in obj); // true
二、Object.create()
为了解决"构造函数法"的缺点,更方便地生成对象, Object.create()用这个方法,"类"就是一个对象,不是函数。
if (!Object.create) { //兼容各大浏览器
Object.create = function (o) {
function F() { }
F.prototype = o;
return new F();
};
}
var Obj = {
fn: function () {
var o = {};
}
};
var o = Object.create(Obj);
alert(o.fn())//名称
这种方法比"构造函数法"简单,但是不能实现私有属性和私有方法,实例对象之间也不能共享数据,对"类"的模拟不够全面。
三、不使用this和prototype,首先,它也是用一个对象模拟"类",在这个类里面,定义一个构造函数fn(),用来生成实例。
var Obj = {
fn: function () {
var o = {};
o.name = "名称";
o.pwd = function () { return "密码"; };
return o;
}
};
使用的时候,调用fn()方法,就可以得到实例对象。
alert(Obj.fn().name) //名称
这种方法的好处是,容易理解,结构清晰优雅,符合传统的"面向对象编程"的构造,因此可以方便地部署下面的特性。
封装
把变量、方法、属性、事件、常数封装到一个对象里。
继承
让一个类继承另一个类,实现起来很方便。只要在前者的fn()方法中,调用后者的fn()方法即可。
私有属性和私有方法
在fn()方法中,只要不是定义在Obj对象上的方法和属性,都是私有的。
数据共享
有时候,我们需要所有实例对象,能够读写同一项内部数据。这个时候,只要把这个内部数据,封装在类对象的里面、fn()方法的外面即可。
var v1 = Obj.fn().name;
var v2 = Obj.fn().name;
alert(v1)//名称
alert(v2)//名称