假设我有以下代码;
var A = {a:10};
var B = {b:20};
B.prototype = A;
alert(B.a);
Run Code Online (Sandbox Code Playgroud)
我对Ba的定义不明确.难道我做错了什么?如何设置对象文字的原型?
我知道如何为Constructor对象做.所以下面的代码是完美的
function A(){this.a=10}
function B(){this.b=20}
B.prototype = new A();
b = new B;
alert(b.a);
Run Code Online (Sandbox Code Playgroud)
我如何为对象文字做到这一点?
我已经阅读了很多关于对象原型属性的精彩文章和讨论(比如这篇),但这里有一个很大的问题.当我们观察" 原型 "属性的行为时,我们意识到它实际上是另一个对象.我们可以看到它有一个像对象一样的自己的proto和构造函数属性.
var myobj= function(){};
myobj.prototype.constructor== myobj --> true
Run Code Online (Sandbox Code Playgroud)
所以这些是问题:
__proto__是在查找链中用于解析方法的实际对象,等等.原型是在__proto__用新创建对象时用于构建的对象".但我们可以看到,这不仅仅是原型的作用.我认为:Prototype就像一个对象的所有共享方法和属性的容器对象!然后,当使用new创建对象的实例时,其内部[[Prototype]]指向原型,其中类的共享行为和属性暴露给实例!
这是真的?最后:似乎当我们实例化一个类时,实例的构造函数被设置为该对象原型的构造函数.这个结论能否成真?
var b= new myobj();
b.constructor== myobj.prototype.constructor --> true
b.constructor == myobj --> true
myobj.prototype={};
b.constructor == myobj --> false
b.constructor== Object --> true
myobj.prototype.constructor== Object --> true
Run Code Online (Sandbox Code Playgroud) function Obj1(name){
this.__proto__={
Name:name,
getName:function(){
alert(this.Name);
}
};
}
function Obj2(name){
this.prototype={
Name:name,
getName:function(){
alert(this.Name);
};
};
}
x=new Obj1("blue shark");
z=new Obj2("red shark");
x.getName();
z.getName();// error:z.getName() is not a function
Run Code Online (Sandbox Code Playgroud)
这两者之间有什么区别?有人说prototype仅用于构造函数,但在这种情况下它不起作用....相反,__proto__工作为什么?
现在我学习JavaScript prototype和__proto__,并发现一些有用的链接
__proto__与constructor.prototype有何不同?
我可以在Chrome下的以下代码中获取__proto__对象的值f.
var Foo = function() {}
var f = new Foo();
f.__proto__
> Foo {}
Run Code Online (Sandbox Code Playgroud)
但是,设置后Foo.prototype.__proto__到null,价值__proto__为undefined.
var Foo = function() {}
Foo.prototype = {name: 'cat', age: 10};
Foo.prototype.__proto__ = null;
var f = new Foo();
f.__proto__
> undefined
Run Code Online (Sandbox Code Playgroud)
但我能得到的价值f.name,这是cat.这是我的理解,因为值f.name可以检索,__proto__对象f应该指向Foo.prototype.为什么价值f.__proto__是undefined?
我知道JavaScript中的函数首先导致函数的双重生命(作为创建实例的第一类)和普通对象的第二个函数.
但我很惊讶看到以下控制台的输出.
function A() {
console.info("A");
}
console.info(A.prototype.constructor === A.constructor); // false
Run Code Online (Sandbox Code Playgroud)
我期望它是真实的,因为我不期望constructor对象的属性,A因为它是自己的属性.因此,在原型链查找后,它应该是同一个对象A.prototype.constructor.我错在哪里或者我遗失了什么?