foo.prototype.z = 3;
//给函数类型的对象foo设置其原型对象的属性为 z = 3 , 函数才有prototyp属性,指示其原型对象。
// 若调用obj.prototype, 会显示 prototype is undefined.这是输出你自己对象上的属性,当访问一个属性的时候,首先会在实例中搜索该属性,如果没有找到该属性,则会继续搜索实例的原型。
是传入参数的原型指向赋值的参数
1. obj.toString() 意思是调用obj原型上的toString函数,调用toString方法返回的是一个字符串,所以typeof obj.toString() 是string
而 obj.toString 只是显示object.prototype的toString函数,不会去调用.
2. Object.create创建的对象属性会存在对象的原型里面,
如var obj = Object.create({x:1}),相当于var obj = {}; obj.prototype.x = 1;
而new 只是存在对象上
还可以是null啊
共享的属性和方法。
正如图所显示,Object.prototype是所有对象的原型链最末端(在这里还找不到方法或属性就是真的找不到了),而这个末端指向了null。
console.log(typeof null);// object
null是一个对象,是终点。所以null没有原型__proto__了,也不会有任何方法了。
原理是一样的,js通过原型链实现继承,java通过类实现继承;js通过__proto__拿到父亲的引用,java通过super拿到父亲的引用。
使用构造函数和原型结合的组合方式,构造函数用来创建实例,原型用来创建所有实力共享的属性和方法,这样,当你修改某一个实例的时候,其他的实例并不会因为你修改了某一个实例的属性货方法而影响其他的实例对象。
谢谢。
b是new出来的一个对象,所以b.toString()返回的是字符串"object object",然后用typeof运算符去判断b.toString()的数据类型就会返回string.
抛开你截图的代码(倒数第二行并不能得到你想要的原型链...),
按你的文字描述foo.g=5的g是foo的自有属性,也就是
foo.hasOwnProperty("g")===true;foo.hasOwnProperty("z")===false;
使用 var obj = new foo() 这种继承方式会把foo.prototype上的属性直接挂到obj.__proto__上,
这种方式和Object.create([Object])继承原理是不同的,老师后面的课程应该会有介绍。
obj 是 foo 的一个实例,它不是一个函数,所以没有prototype
准确的说,只有构造函数才有prototype属性
通常我们自定义的函数都属于构造函数,所以都有此属性
自己有了就不会在沿着原型链查找这个属性了
我不是大神,在这里说一下自己的想法,自己理解的这个,我也不知道是不是正确,你可以看看:
对于1.A=new B,就像ppt中的obj= new foo()一样,a是一个变量obj,表示obj是B的实例,obj的[[proto]]是指向B的说明obj的原型就是B,也就是a的object.prototype就是B,而B再往上指向B自己的原型,此处没有矛盾,而obj变量也就是a对象只有一个原型链。。。下面2和3也可以按照这种思路理解
typeof obj.toString
toString 的T 是小写, 意思就是 返回 obj 的toString 返回值的 type , 说起来很绕口,我们代码举例:
var obj={"x":1} obj.toString >> toString() { [native code] } typeof obj.toString >> "function"
最后的结果其实就是 'function' 这个字符串咯.
分别是什么意思呢, 首先 obj.toString , 应为没有圆括号,所以并没有返回 toString 函数的值, 而是返回了 函数本身, 也就是上面代码中的 toString(){[native code]} , 而typeof obj.toString , 返回的就是 'function' 字符串了,也就是说 obj.toString 这个东西是个函数。
这是高级啊,是往深水中走啊。字符串,数组,函数,对象是怎么来的,它们之间关系。最终还是要用它们来解决问题的抽象再到具体。我快看完了就是有点印象,这些还的去实战化才行,毕竟是高级啊。
new方法里面没有自定义的原型链,create方法可以设置对象的propertype来进行链式调用
JavaScript 声明对象的方法是使用 new 你这个只能说是声明变量。
Object.create() ES5新增的。在创建对象的时候,我们有2种常用方法,一个是文本标记法(var obj = {}),一种是运用Object函数进行对象的创建(new Object()).但是这两种方式并不是创建的一个完完全全"干干净净"的对象,这里的干净只得是没有继承链.
语法:Object.create(proto, [ propertiesObject ]);
proto 一个对象,作为新创建对象的原型。如果 proto 参数不是 null 或一个对象值,则抛出一个 TypeError 异常。null表示没有原型对象(这样就创建了一个"干净的对象")
propertiesObject 一个对象值,可以包含若干个属性,属性名为新建对象的属性名,属性值为那个属性的属性描述符对象.
JS中,函数就是类!
以下是个人理解,并有在某浏览器实践过,不知道其他游览器怎么样。
其实可以直接foo.x=3;的,只不过这个时候这个属性是在该对象上的,即可以用foo.x;来调用,会输出3。执行foo.hasOwnProperty('x');返回true。此时如果obj.x(假如obj本身没有定义这个属性),则会输入undefined,应该是因为foo.x是局部变量吧!此时可以通过obj.constructor.x来获取。
而foo.prototype.z=4;此时的z为原型链上的。如果你此时直接foo.z是会输入undefined的。同样如果执行foo.hasOwnProperty('z');返回false。但我们可以直接通过obj.z来获取z值,此时输出4.是因为javascript的原型链机制,所以当z这个属性不存在obj这个对象上时会沿着原型链查找。
我想这里老师主要是为了要讲解原型链,所以用了prototype。
其实简单来说就是如果写成foo.z,那么z就变成私有变量,外部是无法访问的(我觉得是这样的)。。
__proto__是内部属性,不推荐使用,各个浏览器的内部属性名称是有区别的;
如果一个对象的属性和原型上的属性重名,那就相当于覆盖;
如果要取原型对象上的属性,可以通过constructor获取;
如下图:
。。。。。。。。。。。。。你开心就好