js中什么是构造函数数

修改构造函数原型——JavaScript中的对象(二)
我的图书馆
修改构造函数原型——JavaScript中的对象(二)
Email:longsu2010 at yeah dot net今天先不写原型继承,先看一个误区:“改变构造函数的原型(prototype)将魔法般的(magically)更新新对象和已经存在的对象……”
这是完全错误的,不要相信解释JavaScript(包括任何事情)时使用了魔法(magic)这个单词的作者。
function C() {} //constructor
var x = new C();
C.prototype.prop = 2;
var y = new C();
alert(x.prop);
alert(y.prop);
这段代码将alert "2" 和 "2",这似乎证实了上面引号中的定义,因为x对象在创建后增加了属性prop。魔法般的?其实不是,看下面的例子。
function C() {} //constructor
var x = new C();
C.prototype = {prop: 2};
var y = new C();
alert(x.prop);
alert(y.prop);
这段代码将alert "undefined" 和 "2"。在第一个例子中对象x和y均有属性prop。他们是隐藏在对象所引用的原型中(隐藏? 因为只有解析器可以访问它)。当访问prop属性的时候JavaScript无法在对象本身中找到,之后会搜索原型链,在原型链中找到并返回。这对于一个程序员来说是透明的。当你向原型中增加一个新属性的时候对象x是不改变的。当你访问prop属性的时候会在更新后的原型中找到它。第二个例子中我们将原型改为一个新对象,而x依然使用旧的原型,但是y使用的是新原型,所以x和y不共享原型。很明显旧原型不存在prop属性。更糟糕的是,现在你丢失了唯一的访问点(无法访问旧原型了)。虽然创建对象的语法相同,但是他们是不同的。另外,众所周知,每一个对象有一个constructor属性指向构造函数。但是像prop那样,constructor属性存在于原型中而不是对象本身。重写原型的同时也重写了constructor属性,如下:alert(x.constructor); // "function C() {}"
alert(y.constructor); // "function Object() { [native code] }"因此当你重写原型后constructor属性是不可信的,但是重写原型又是JavaScript中的重要技术。译者:本文讲述了JavaScript中重写原型后原型不一致的问题和constructor属性指向问题。动态修改原型对象不会在已有对象中生效。重写原型对象后constructor的指向将是不可信的,可以在重写原型后将constructor属性重新赋值。如function C();C.prototype = {};
C.prototype.constructor = C;
相关文章:
TA的最新馆藏[转]&[转]&[转]&
喜欢该文的人也喜欢实例化对象可以访问到自己的属性,当函数内有return的时候,就获取不到了。如何使dd()生效?下面为大家提供个示例参考学习
以下是程序代码&!DOCTYPE HTML&
&html lang=&en&&
&meta charset=&UTF-8&&
&title&&/title&
&script type=&text/javascript&&
function demo(){
var that =
this.age=10;
var name = &ryan&;
aa : function(){
bb : function(){
alert(name);
cc : &foo&,
dd : function(){
return that.age
alert(aa.dd());
[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]
相关排行总榜JavaScript构造函数详解
字体:[ ] 类型:转载 时间:
构造函数就是初始化一个实例对象,对象的prototype属性是继承一个实例对象。本文给大家分享javascript构造函数详解,对js构造函数相关知识感兴趣的朋友一起学习吧
构造函数就是初始化一个实例对象,对象的prototype属性是继承一个实例对象。
& 构造函数注意事项:
1.默认函数首字母大写
2.构造函数并没有显示返回任何东西。new 操作符会自动创建给定的类型并返回他们,当调用构造函数时,new会自动创建this对象,且类型就是构造函数类型。
3.也可以在构造函数中显示调用return.如果返回的值是一个对象,它会代替新创建的对象实例返回。如果返回的值是一个原始类型,它会被忽略,新创建的实例会被返回。&&&&
function Person( name){
this.name =
var p1=new Person('John');
function person(name ){
Object obj =new Object();
obj.name =
var p1= person("John");
4.因为构造函数也是函数,所以可以直接被调用,但是它的返回值为undefine,此时构造函数里面的this对象等于全局this对象。this.name其实就是创建一个全局的变量name。在严格模式下,当你补通过new 调用Person构造函数会出现错误。
5.也可以在构造函数中用Object.defineProperty()方法来帮助我们初始化:
function Person( name){
Object.defineProperty(this, "name"{
get :function(){
set:function (newName){
name =newN
enumerable :true, //可枚举,默认为false
configurable:true //可配置
var p1=new Person('John');
6.在构造函数中使用原型对象&&&&&&
//比直接在构造函数中写的效率要高的多
Person.prototype.sayName= function(){
console.log(this.name);
但是如果方法比较多的话,大多人会采用一种更简洁的方法:直接使用一个对象字面形式替换原型对象,如下:&&&&&&
Person.prototype ={
sayName :function(){
console.log(this.name);
toString :function(){
return "[Person "+ this.name+"]" ;
这种方式非常流行,因为你不用多次键入Person.prototype,但有一个副作用你一定要注意:
使用字面量形式改写了原型对象改变了构造函数的属性,因此他指向Object而不是Person。这是因为原型对象具有一个constructor属性,这是其他对象实例所没有的。当一个函数被创建时,它的prototype属性也被创建,且该原型对象的constructor属性指向该函数。当使用对象字面量形式改写原型对象时,其constructor属性将被置为泛用对象Object.为了避免这一点,需要在改写原型对象的时候手动重置constructor,如下:
Person.prototype ={
constructor :Person,
sayName :function(){
console.log(this.name);
toString :function(){
return "[Person "+ this.name+"]" ;
再次测试:
p1.constructor===Person
p1.constructor===Object
p1 instanceof Person
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 js中什么是构造函数 的文章

 

随机推荐