js new

The new operator must be followed by a function invocation. It creates a new object, with no properties and then invokes the function, passing the new object as the value of the this keyword. A function designed to be used with the new operator is called a constructor function or simply a constructor. A constructor's job is to initialize a newly created object, setting any properties that need to be set before the object is used. 

函数会被当成一个构造函数,从而得到一个对象。也可以说,new是一个运算符,这个运算符的执行结果是一个对象。如果不以new的方式执行函数的话,那就是一个普通函数。普通函数的返回值,就由函数决定了


new 
javascript 的new 运算符创建一个继承于其运算数的原型的新对象,然后调用该运算数,把新创建的对象绑定给this,这个运算数(它应该是一个构造器函数)一个机会在返回给请求者前去自定义创建的对象 
如果没有new 运算符,你所做就是普通人的函数调用,并且把this绑定到全局对象(window)


void 
void 是一个运算符,它接受受一个运算数并返回undefined   应该尽可能不用它

Js代码    收藏代码
  1. function aa() {  
  2.     this.name = "haha";  
  3.     alert(this.setInterval);  
  4. };  
  5. aa();  
  6. alert(new aa().name);  

 

aa()弹出一个alert,new aa()还弹出一个alert,最后alert一个name,总共3次

结果依次是: function setInterval() {[native code]}, undefined, haha

 

aa()运行上下文是window,this指向window,之后new了一个aa,上下文就变了,alert(this.setInterval)就弹出一个undefined, 然后name正确被弹出,这说明this指向的是new出的新对象。

直接调用Person方法时,这儿的this指的是window,只有在new Person的时候,this才指的是Person的一个实例,原本这儿就是为了判断是直接调用,还是在new。但是当window里也有这个方法或者属性的时候,就失效了

对象寻找属性时,如果自己没有这个属性,会在构造函数的propotype所指向/引用的对象中找,看能否找到同名属性,如果构造函数的prototype没有还会找prototype对象的构造函数的prototype对象, 
如果找到,就会读取它的值并返回.(这个过程会持续向上,直到持续到Object对象为止,即所谓原型方式的继承). 

注意:以上是读,如果写一个属性的话就是直接给这个对象定义了一个属性,读写不对等

原型是有链的。static可没有。
简单说,原型机制是一种求取默认值的机制。

只要是变量或对象都有Object.prototype的原形属性。 
比如:var i = 1; 这里i就可以调用Object.prototype。

js的new可以看成是一个代理模式的代理类。包裹了new 后面的函数

处理顺序为
1.创建一个function对象,并将prototype设置为传入函数
2.执行传入函数
3.判断传入函数返回值,如果为null,则返回第一步的function对象。

/** 
* JavaScript 是面向对象的语言,但是他的面向对象不是基于类的,是基于原型的; 
* 但是他的一些特性(函数是数据),使得它可以模拟基于类的面向对象,但是 JavaScript 并不支持和 Java 一样的类, 
* 因此 JavaScript 中的"类"可以称作"伪类" 
*/ 
// 
/** 
* 构造函数: js 中用来和 new 运算符一起使用的函数称作构造函数 

* 构造函数通常没有返回值,构造函数初始化作为 this 的值传递来的对象,并且没有返回值; 

* 然而,一个构造函数是允许返回一个对象的值的,并且,如果他这么做,返回的对象成为 new 表达式的值; 
* 在此情况下,作为 this 的值的对象将会被抛弃。 
* [ jQuery 中的 jQuery.fn.init 构造函数有返回值 ] 
*/ 
// 
function User( name, age){ 
this.name = name; 
this.age = age; 
// return; // 返回 this 
// return null; // 返回 this 
// return this; 
// return []; // 返回 [] 
// return function(){}; // 返回 这个 function,抛弃 this 
// return false; // 返回 this 
// return new Boolean( false); // 返回新 boolean;抛弃 this 
// return 'hello world'; // 返回 this 
// return new String( 'hello world'); // 返回 新建的 string,抛弃 this 
// return 2; // 返回 this 
// return new Number( 32); // 返回新的 number,抛弃 this 

var me = new User( 'myhere', 23); 
/** 
* new 运算符的工作过程 
* 1, 创建一个空对象 
* 2, 设置这个对象的原型;一个对象的原型就是他的构造函数的 prototype 属性的值。 
* 所有的函数都有一个 prototype 属性,当这个函数被定义的时候,prototype 属性自动的创建和初始化。 
* prototype 属性的初始化值是一个对象,这个对象只有一个属性,就是 constructor,他指回到和原型相关联的那个构造函数 
* 3, 将这个空对象作为 this 的值传递给构造函数来执行这个构造函数,及用构造函数初始化对象 
* 4, 构造函数是否有 return 语句 
有 return 语句: (具体情况见上面例子) 
是否 return 一个对象(注意必须是对象) 
是:则使用这个对象作为 new 表达式的值 
否:忽略 return 语句返回构造函数初始化的对象 
无 return 语句: 
返回 this 
*/ 
// 
// 
/** 
* 所有函数都有一个 prototype 属性 
* 每个对象都有一个 constructor 属性,他引用了初始化这个对象的构造函数 
*/ 
/** 
* 关于 for/in 语句 
* 1, for/in 语句遍历属性时顺序是无规则的 
* 2, for/in 循环并不会遍历所有对象的所有可能的属性; 
对象的有些属性以相同的方式标记成了只读的、永久的(不可删除的) 或者 不可列举的,这些属性使用 for/in 循环不能枚举出来。 
虽然所有的用户自定义属性都可以枚举,但是许多内部属性,包括所有内部方法都是不可枚举的。 

猜你喜欢

转载自xjf975999.iteye.com/blog/1706468