关于__proto__与prototype ---写给懂java的人看(我们都被忽悠了.........)
2013-09-30 00:12
267 查看
我之前是搞java的,现在转前端,我都快被JavaScript的__proto__和prototype快整崩溃了,花了几天时间,查了好多资料,最后我哑然失笑,我发现,我被忽悠了..................
我们先来看以下java的类和java的继承关系:
Class Person{ //定义类Person
String name;
int age;
Person(name,age){ //这个是Pserson的构造器
this.name = name;
this.age = age;
}
}
Person person = new Person("xiaowang",22); //new 一个Person的实例
这里的person实例是通过类Person的构造器new出来的,同时java里面所有的类都是Object的子类
我们在看JavaScript的prototype和__proto__
先看两个例子
function Dog(){}
var dog = new Dog();
Dog.prototype.constructor == Dog ==>true
这句话的意思是Person的原型的构造器是Person
这个是神马意思??
我的神,那你们说用java的话来说Person的原型 的原型是神马东东?
看出来了吗,看不出来就网上看哪个java的例子,上面我们定义了一个Class
Person 定义了一个类
它的名字就叫Person,同时我们还给Person定义了一个构造器,那你们说说,我们定义的那个构造器是谁的构造器
,没错它就是Person的构造器,清楚了吧.
看回来,Dog是不是一个构造器,那它是谁的构造器,Dog.prototype.constructor
== Dog 这句话说的很
明白了,Dog是(Dog.prototype)的构造器,那么清楚了把,用java来说,这个
Dog.prototype 这个东西我们应该叫什么
没错,Dog.prototype 这个东西在java就叫做类,它有一个构造器叫做Dog.
另外还有__proto__这个东西,实际上它就是java里的extend继承
明白了这层关系,接下来就好理解了.下面的代码你们去运行以下,就什么都明白了;(把下面的代码贴到Chrome的控制台看看
,结果都返回true)
function
Person(){}; //定义Person类
var
person = new Person(); //new 一个Person的实例
var
arr = [1,2,3]; //定义一个数组
console.dir(person.__proto__
== Person.prototype); //Person实例person继承 类(Person.prototype)的属性
console.dir(arr.__proto__
== Array.prototype)
console.dir(Person.prototype.__proto__
== Object.prototype); //Person.prototype继承Object.prototype (大白话:Person类继承Object类)
console.dir(Array.prototype.__proto__
== Object.prototype)
console.dir(Object.prototype.__proto__
== null); //(类)Object.prototype
是顶级类,它上边没人了
console.dir(Person.__proto__
== Function.prototype); //(构造器)Person 继承根类构造器Function.protype == function Empty(){};
console.dir(Array.__proto__
== Function.prototype) //(构造器)Array继承根类构造器Function.protype
console.dir(Object.__proto__
== Function.prototype); //实际上所有构造器都继承根类构造器
console.dir(Function.prototype.__proto__
== Object.prototype); //Functon 可以看做是根类构造器,由于function也是对象,所以,最终
Function.prototype.__proto__
== Object.prototype 就返回了true;
由于工作很忙,以上是匆忙写下的,所以可能很多东西都讲得不是太清楚.有什么问题,希望大家留言讨论,同时希望在这里能多交几个志同道合的朋友,
本人qq:12448035,遗憾的是,在公司限制上q只能上网查资料而已.
我们先来看以下java的类和java的继承关系:
Class Person{ //定义类Person
String name;
int age;
Person(name,age){ //这个是Pserson的构造器
this.name = name;
this.age = age;
}
}
Person person = new Person("xiaowang",22); //new 一个Person的实例
这里的person实例是通过类Person的构造器new出来的,同时java里面所有的类都是Object的子类
我们在看JavaScript的prototype和__proto__
先看两个例子
function Dog(){}
var dog = new Dog();
Dog.prototype.constructor == Dog ==>true
这句话的意思是Person的原型的构造器是Person
这个是神马意思??
我的神,那你们说用java的话来说Person的原型 的原型是神马东东?
看出来了吗,看不出来就网上看哪个java的例子,上面我们定义了一个Class
Person 定义了一个类
它的名字就叫Person,同时我们还给Person定义了一个构造器,那你们说说,我们定义的那个构造器是谁的构造器
,没错它就是Person的构造器,清楚了吧.
看回来,Dog是不是一个构造器,那它是谁的构造器,Dog.prototype.constructor
== Dog 这句话说的很
明白了,Dog是(Dog.prototype)的构造器,那么清楚了把,用java来说,这个
Dog.prototype 这个东西我们应该叫什么
没错,Dog.prototype 这个东西在java就叫做类,它有一个构造器叫做Dog.
另外还有__proto__这个东西,实际上它就是java里的extend继承
明白了这层关系,接下来就好理解了.下面的代码你们去运行以下,就什么都明白了;(把下面的代码贴到Chrome的控制台看看
,结果都返回true)
function
Person(){}; //定义Person类
var
person = new Person(); //new 一个Person的实例
var
arr = [1,2,3]; //定义一个数组
console.dir(person.__proto__
== Person.prototype); //Person实例person继承 类(Person.prototype)的属性
console.dir(arr.__proto__
== Array.prototype)
console.dir(Person.prototype.__proto__
== Object.prototype); //Person.prototype继承Object.prototype (大白话:Person类继承Object类)
console.dir(Array.prototype.__proto__
== Object.prototype)
console.dir(Object.prototype.__proto__
== null); //(类)Object.prototype
是顶级类,它上边没人了
console.dir(Person.__proto__
== Function.prototype); //(构造器)Person 继承根类构造器Function.protype == function Empty(){};
console.dir(Array.__proto__
== Function.prototype) //(构造器)Array继承根类构造器Function.protype
console.dir(Object.__proto__
== Function.prototype); //实际上所有构造器都继承根类构造器
console.dir(Function.prototype.__proto__
== Object.prototype); //Functon 可以看做是根类构造器,由于function也是对象,所以,最终
Function.prototype.__proto__
== Object.prototype 就返回了true;
由于工作很忙,以上是匆忙写下的,所以可能很多东西都讲得不是太清楚.有什么问题,希望大家留言讨论,同时希望在这里能多交几个志同道合的朋友,
本人qq:12448035,遗憾的是,在公司限制上q只能上网查资料而已.
相关文章推荐
- 关于Java与.net的争论,我们从编程思维上来找取舍。
- 关于 __proto__和prototype的一些理解
- 关于 JavaScript prototype __proto__ 一点总结
- 关于__proto__和prototype
- 关于java代码中的注释问题。(类中方法的注释,我们一般都要写上这个方法的文档(doc),方法的参数也要有它的文档)
- 关于__proto__和prototype的一些理解
- 我们应该时刻记住的一些话--关于职场,关于工作 【写给工作的人,特别是初入职场的人】
- 关于__proto__和prototype的一些理解
- Java80商城系统第十节-轮播图和关于我们
- 前言 我们知道不同的操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。 关于FileSy
- 关于__proto__和prototype的一些理解
- 关于继承的prototype , _proto_, constructor
- 关于java反编译:被证实的怀疑让我们收获
- 关于this、arguments、caller、callee、prototype、__proto__、length
- 关于java的collection框架我们最应该知道的两个接口和四个实现类
- 写给那些大学不怎么用功的我们:学习java的一些心得、对java发展的看法和一些代码
- 关于java中JButton的样式设置(的一些我们应该知道的函数)(转)
- 关于__proto__和prototype的一些理解
- 关于JS call apply 对象、对象实例、prototype、Constructor、__proto__
- c++ java中关于protobuf反序列化对象实体和实体处理(函数)关系(二)