__JavaScript中的原型与原型

__JavaScript中的原型与原型,javascript,prototype,javascript-objects,prototypal-inheritance,Javascript,Prototype,Javascript Objects,Prototypal Inheritance,此图再次显示每个对象都有一个原型。建造师 函数Foo也有自己的\uuuu proto\uuu,即function.prototype, 反过来,也通过其\uuuuu proto\uuuu属性再次引用 对象。原型。因此,重复一下,Foo.prototype只是一个显式的 Foo的属性,它引用b和c对象的原型 \uuu proto\uu和prototype之间有什么区别 该图取自。\uuuuu proto\uuuu是查找链中用于解析方法等的实际对象。prototype是使用新建创建对象时用于构建\

此图再次显示每个对象都有一个原型。建造师 函数Foo也有自己的
\uuuu proto\uuu
,即function.prototype, 反过来,也通过其
\uuuuu proto\uuuu
属性再次引用 对象。原型。因此,重复一下,Foo.prototype只是一个显式的 Foo的属性,它引用b和c对象的原型

\uuu proto\uu
prototype
之间有什么区别


该图取自。

\uuuuu proto\uuuu
是查找链中用于解析方法等的实际对象。
prototype
是使用
新建
创建对象时用于构建
\uuuu proto\uuu
的对象:

( new Foo ).__proto__ === Foo.prototype;
( new Foo ).prototype === undefined;

\uuuuu proto\uuuu
是在查找链中用于解析方法等的实际对象。
prototype
是使用
新建
创建对象时用于构建
\uuuu proto\uuu
的对象:

( new Foo ).__proto__ === Foo.prototype;
( new Foo ).prototype === undefined;

prototype
是函数对象的属性。它是由该函数构造的对象的原型

\uuuu proto\uuu
是对象的内部属性,指向其原型。当前的标准提供了一个等价的
对象.getPrototypeOf(O)
方法,尽管事实上的标准
\uuuuuuuuuuuuuuuu
更快

通过比较函数的
原型
与对象的
原型
链,可以找到
实例的
关系,通过更改
原型
可以打破这些关系

function Point(x, y) {
    this.x = x;
    this.y = y;
}

var myPoint = new Point();

// the following are all true
myPoint.__proto__ == Point.prototype
myPoint.__proto__.__proto__ == Object.prototype
myPoint instanceof Point;
myPoint instanceof Object;
function Foo() {};
Foo.prototype // Object {constructor: function}
Foo.prototype.constructor === Foo // true

这里的
Point
是一个构造函数,它按程序构建一个对象(数据结构)
myPoint
是一个由
Point()
构造的对象,因此
Point。prototype
会保存到
myPoint。\uuuuuu proto\uuuuu
是函数对象的属性。它是由该函数构造的对象的原型

\uuuu proto\uuu
是对象的内部属性,指向其原型。当前的标准提供了一个等价的
对象.getPrototypeOf(O)
方法,尽管事实上的标准
\uuuuuuuuuuuuuuuu
更快

通过比较函数的
原型
与对象的
原型
链,可以找到
实例的
关系,通过更改
原型
可以打破这些关系

function Point(x, y) {
    this.x = x;
    this.y = y;
}

var myPoint = new Point();

// the following are all true
myPoint.__proto__ == Point.prototype
myPoint.__proto__.__proto__ == Object.prototype
myPoint instanceof Point;
myPoint instanceof Object;
function Foo() {};
Foo.prototype // Object {constructor: function}
Foo.prototype.constructor === Foo // true

这里的
Point
是一个构造函数,它按程序构建一个对象(数据结构)
myPoint
是由
Point()
构造的对象,因此
Point.prototype
会保存到
myPoint.\uuuuuuuu
中。声明函数时会创建prototype属性

例如:

 function Person(dob){
    this.dob = dob
 }; 
Person.prototype
属性在声明上述函数后在内部创建。 可以向Person.prototype添加许多属性,这些属性由使用new Person()创建的Person实例共享

值得注意的是,默认情况下,
Person.prototype
是一个
对象
文本(可以根据需要进行更改)

使用
new Person()
创建的每个实例都有一个
\uuuu proto\uuuu
属性,该属性指向
Person.prototype
。这是用于遍历以查找特定对象特性的链

var person1 = new Person(somedate);
var person2 = new Person(somedate);
创建
Person
的两个实例,这两个对象可以调用
age
方法
Person.prototype
作为
person1.age
person2.age


在您问题的上图中,您可以看到
Foo
是一个
函数对象
,因此它有一个
\uuuuu proto\uuuu
链接到
函数.prototype
,prototype是
对象
的一个实例,并且有一个
\uuu proto\uuu
链接到
对象.prototype
。proto链接在这里以
对象中的
\uu proto\uu
结束。prototype
指向
null

任何对象都可以访问其由
\uuuuu proto\uuuu
链接的原型链中的所有属性,从而形成原型继承的基础

\uuuu proto\uuuu
不是访问原型链的标准方法,标准但类似的方法是使用
Object.getPrototypeOf(obj)

下面的
instanceof
运算符代码有助于更好地理解:

object
instanceof
Class运算符在对象是类的实例时返回
true
,更具体地说,如果在该对象的原型链中找到
Class.prototype
,则该对象是该类的实例

function instanceOf(Func){
  var obj = this;
  while(obj !== null){
    if(Object.getPrototypeOf(obj) === Func.prototype)
      return true;
    obj = Object.getPrototypeOf(obj);
  }
  return false;
}      

上述方法可以被称为:
instanceOf.call(object,Class)
,如果object是类的实例,则返回true。

在声明函数时创建原型属性

例如:

 function Person(dob){
    this.dob = dob
 }; 
Person.prototype
属性在声明上述函数后在内部创建。 可以向Person.prototype添加许多属性,这些属性由使用new Person()创建的Person实例共享

值得注意的是,默认情况下,
Person.prototype
是一个
对象
文本(可以根据需要进行更改)

使用
new Person()
创建的每个实例都有一个
\uuuu proto\uuuu
属性,该属性指向
Person.prototype
。这是用于遍历以查找特定对象特性的链

var person1 = new Person(somedate);
var person2 = new Person(somedate);
创建
Person
的两个实例,这两个对象可以调用
age
方法
Person.prototype
作为
person1.age
person2.age

在您问题的上图中,您可以看到
Foo
是一个
函数对象
,因此它有一个
\uuuu proto\uuu
链接到
函数.prototype
,而这又是一个ins
function Person(name){
    this.name = name
 }; 

var eve = new Person("Eve");

eve.__proto__ == Person.prototype //true

eve.prototype  //undefined
> var a = 1
undefined
> a.__proto__
[Number: 0]
> Number.prototype
[Number: 0]
> Number.prototype === a.__proto__
true
    function Foo(message){

         this.message = message ; 
     };

     console.log(Foo.prototype);
    var a = new Foo("a");
    var b = new Foo("b");
    console.log(a.message);
    console.log(b.message);
    b.__proto__ === Object.getPrototypeOf(a);
    a.__proto__ ===  Foo.prototype;
    a.constructor.prototype  === a.__proto__;
    Foo.prototype.Greet = function(){

         console.log(this.message);
    }
    a.Greet();//a
    b.Greet();//b
    a.constructor.prototype.Greet();//undefined 
function Foo() { }

var bar = new Foo()

// `bar` is constructed from how Foo knows to construct objects
bar.__proto__ === Foo.prototype // => true

// bar is an instance - it does not know how to create objects
bar.prototype // => undefined
 function a (name) {
  this.name = name;
 }
     constructor: a  // function definition
    __proto__: Object
var b = new a ('JavaScript');
    function Person (name, age) {
        this.name = name;
        this.age = age;  

    } 
    var John = new Person(‘John’, 37);
    // John is an object
    Person.prototype.getOlder = function() {
        this.age++;
    }
    // getOlder is a key that has a value of the function
    John.getOlder();
    Person.prototype;
var a = { name: "wendi" };
a.__proto__ === Object.prototype // true
Object.getPrototypeOf(a) === Object.prototype // true

function Foo() {};
var b = new Foo();
b.__proto__ === Foo.prototype
b.__proto__.__proto__ === Object.prototype
function Foo() {};
Foo.prototype // Object {constructor: function}
Foo.prototype.constructor === Foo // true
{}.prototype // undefined;
(function(){}).prototype // Object {constructor: function}

// The example above shows object does not have the prototype property.
// But we have Object.prototype, which implies an interesting fact that
typeof Object === "function"
var obj = new Object();
function Foo() {}
var b = new Foo();

b.__proto__ === Foo.prototype // true
Foo.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
function Robot(name) {
    this.name = name;
}
var robot = new Robot();

// the following are true   
robot.__proto__ == Robot.prototype
robot.__proto__.__proto__ == Object.prototype
function Robot(name) {
    this.name = name;
}
// imaginary class
class Robot extends Object{

    static prototype = Robot.class  
    // Robot.prototype is the way to add things to Robot class
    // since Robot extends Object, therefore Robot.prototype.__proto__ == Object.prototype

    var __proto__;

    var name = "";

    // constructor
    function Robot(name) {

        this.__proto__ = prototype;
        prototype = undefined;

        this.name = name;
    }

} 
var robot = new Robot();

robot.__proto__ == Robot.prototype
robot.prototype == undefined
robot.__proto__.__proto__ == Object.prototype
Robot.prototype.move(x, y) = function(x, y){ Robot.position.x = x; Robot.position.y = y};
// Robot.prototype.move(x, y) ===(imagining)===> Robot.class.move(x, y)
// Swift way of extention
extension Robot{
    function move(x, y){    
        Robot.position.x = x; Robot.position.y = y
    }
}
// imaginary class
class Robot{

    static prototype = Robot.class // Robot.prototype way to extend Robot class
    var __proto__;

    var name = "";

    // constructor
    function Robot(name) {

        this.__proto__ = prototype;
        prototype = undefined;

        this.name = name;
    }

    // added by prototype (as like C# extension method)
    function move(x, y){ 
        Robot.position.x = x; Robot.position.y = y
    };
}
function Foo(name){
  this.name = name
  Foo.__proto__.collection.push(this)
  Foo.__proto__.count++

}

Foo.__proto__.count=0
Foo.__proto__.collection=[]

var bar = new Foo('bar')
var baz = new Foo('baz')

Foo.count;//2
Foo.collection // [{...}, {...}]
bar.count // undefined
'use strict'
function A() {}
var a = new A();
class B extends A {}
var b = new B();
console.log('====='); // =====
console.log(B.__proto__ === A); // true
console.log(B.prototype.__proto__ === A.prototype); // true
console.log(b.__proto__ === B.prototype); // true
console.log(a.__proto__ === A.prototype); // true
console.log(A.__proto__ === Function.__proto__); // true
console.log(Object.__proto__ === Function.__proto__); // true
console.log(Object.prototype === Function.__proto__.__proto__); // true
console.log(Object.prototype.__proto__ === null); // true
console.log(a.constructor === A); // true
// "a" don't have constructor,
// so it reference to A.prototype by its ``__proto__`` property,
// and found constructor is reference to A
console.log(Object.getPrototypeOf(a) === a.__proto__); // true
function Dog(){}
Dog.prototype.bark = "woof"

let myPuppie = new Dog()
> myPuppie.__proto__
>> {bark: "woof", constructor: ƒ}
> myPuppie.prototype
>> undefined
( new Foo ).__proto__ === Foo.prototype;
( new Foo ).prototype === undefined;
function Human(){
    this.speed = 25;
}

var himansh = new Human();

Human.prototype.showSpeed = function(){
    return this.speed;
}

himansh.__proto__ === Human.prototype;  //true
himansh.showSpeed();    //25

//now re-initialzing the Human.prototype aka changing its memory location
Human.prototype = {lhs: 2, rhs:3}

//himansh.__proto__ will still continue to point towards the same original memory location. 

himansh.__proto__ === Human.prototype;  //false
himansh.showSpeed();    //25
let x = {name: 'john'};
let x = new String("testing") // Or any other javascript object you want to create

Object.getPrototypeOf(x) === x.__proto__; // true
var Cat = function() {}
var tom = new Cat()
function protofoo(){
}
var protofoo1 = new protofoo();
console.log(protofoo.prototype.toString()); //[object Object]
var foo={
  check: 10
};
console.log(foo.__proto__); // empty
console.log(bar.prototype); //  TypeError
foo.__proto__ = protofoo1; // assigned
console.log(foo.__proto__); //protofoo
// we can create `bar` and link it to `foo`
var bar = Object.create( foo );
bar.fooprops= "We checking prototypes";
console.log(bar.__proto__); // "foo"
console.log(bar.fooprops); // "We checking prototypes"
console.log(bar.check); // 10 is delegated to `foo`
let myObject= {
    a: 2
};

console.log(myObject.a);            // 2
let anotherObject= {
    a: 2
};

// create an object linked to anotherObject
let myObject= Object.create(anotherObject);
console.log(myObject.a);                // 2
// for..in loop uses [[Prototype]] chain lookup process
let anotherObject= {
    a: 2
};

let myObject= Object.create(anotherObject);

for(let k in myObject) {
    console.log("found: " + k);            // found: a
}

// in operator uses [[Prototype]] chain lookup process
console.log("a" in myObject);              // true
let foo= function(){}

console.log(foo.prototype);        
// returns {constructor: f} object which now contains all the default properties

foo.id= "Walter White";

foo.job= "teacher";

console.log(foo.prototype);       
// returns {constructor: f} object which now contains all the default properties and 2 more properties that we added to the fn object
/*
{constructor: f}
    constructor: f()
        id: "Walter White"
        job: "teacher"
        arguments: null
        caller: null
        length: 0
        name: "foo"
        prototype: {constructor: f}
        __proto__: f()
        [[FunctionLocation]]: VM789:1
        [[Scopes]]: Scopes[2]
    __proto__: Object

*/
{}.prototype;                            // SyntaxError: Unexpected token '.'

(function(){}).prototype;                // {constructor: f}
let Letter= function(){}

let a= new Letter();

Letter.from= "Albuquerque";

Letter.prototype.to= "New Hampshire";

console.log(a.from);                // undefined

console.log(a.to);                  // New Hampshire
Object.defineProperty(Object.prototype, "__proto__", {
    get: function() {
        return Object.getPrototypeOf(this);
    },
    set: function(o) {
        Object.setPrototypeOf(this, o);
        return o;
    }
});
let Letter= function() {}

let a= new Letter();

let b= new Letter();

let z= new Letter();

// output in console
a.__proto__ === Letter.prototype;               // true

b.__proto__ === Letter.prototype;               // true

z.__proto__ === Letter.prototype;               // true

Letter.__proto__ === Function.prototype;        // true

Function.prototype.__proto__ === Object.prototype;        // true

Letter.prototype.__proto__ === Object.prototype;          // true