Prototip yönteminin amacı nedir?


10

Javascript: İyi Parçalar'ı okuyorum ve kafamı prototipler bölümünde bulmak için uğraştım .

Küçük bir google'dan sonra , nesnelerin beyanından sonra nesnelere özellik eklemek olduğu sonucuna vardım .

W3schools bu parıltı kullanarak, prototip özelliği ekleyerek satır kaldırmanın bir etkisi olduğunu fark ettim . Peki amaç ne?


//Prototyping

function employee(name,jobtitle,born)
{
this.name=name;
this.jobtitle=jobtitle;
this.born=born;
}

var fred=new employee("Fred Flintstone","Caveman",1970);
employee.prototype.salary=null; //  <---  try removing this line
fred.salary=20000;

(Fred.salary) document.write;


4
@Raynos iyi dedi, ancak bir değiştirme önermek, örneğin MDN belgeleri: developer.mozilla.org/en/JavaScript
StuperUser

Yanıtlar:


13

Prototip böyle çalışmaz. Prototip, prototip zincirinde kullanılır.

Bir nesneye bir özellik almaya çalıştığınızda, o özellik adı için nesneyi kontrol eder. Eğer yoksa, prototipe bakacaktır.

Misal:

var o = {
  "foo": "bar",
  "method": function() { ... }
};

var o2 = Object.create(o);
var o3 = Object.create(o);

console.log(o2.hasOwnProperty("foo")); // false
console.log(o2.foo); // "bar"
console.log(o2.__proto__ === o); // true
o.baz = "foobar";
console.log(o2.baz); // "foobar"

Bu yüzden prototipin amacı basitçe kod yeniden kullanımı ve kalıtımdır.


Tamam, şimdi anladım. Ama dinamik bir özellik eklemeyi denedim, ve bu beni anlatıyor prototype is undefined---o.prototype.newProp = "mutts nuts";
Hafif Fuzz

3
@MildFuzz obir nesnedir. .prototypeMülkiyet fonksiyonları kullanılır, bunu görmezden. Just doo.newProp = "mutts nuts"
Raynos

7

Bunu yaptığınızda fred.salary=20000, maaş niteliğini sadece fred'e eklediniz. Prototip kullanırken, o andan itibaren oluşturacağınız tüm çalışanların maaş özelliği olacaktır.

Diyelim ki 100 çalışanınız var ve hepsine maaş özelliği eklemek istiyorsunuz. Bunu manuel olarak yapabilir, her çalışanı tekrarlayabilir ve ekleyebilirsiniz. Veya prototip kullanabilir ve hepsine uygun olup olmadığını ayarlayabilirsiniz.

Prototip, zaten var olan bir şeye işlevsellik sağlamak istediğinizde yararlıdır. Dizilere özel bir yöntem eklemek istediğinizi varsayalım. Gibi bir şey yapardınız:

Array.prototype.my_custom_method = function() {...}

Oradan, oluşturacağınız tüm diziler bu yöntemi kullanabilecektir.


3
Kimsenin bunun bellek kullanımını azaltmak için tasarlandığından bahsetmediğine şaşırdım. Çok fazla koda sahip karmaşık bir nesne uygulamanız gerekiyorsa, kodun nesnenin her örneğinde tekrarlanmasını istemezsiniz. Açıkçası, veri özelliklerinin her durumda farklı olma olasılığı daha yüksektir, ancak genellikle kodun yalnızca bir kopyasını istersiniz, bu yüzden onu prototipe koyarsınız.
Dominic Cronin

1
IMO bu şimdiye kadarki en iyi cevap.
Muffin Adam

5

Bu makaleye göz atmak isteyebilirsiniz .

Prototip tabanlı bir dil, şablon olarak kullanılan ve yeni bir nesnenin başlangıç ​​özelliklerini almak için kullanılan bir nesne olan prototip bir nesne kavramına sahiptir. Herhangi bir nesne, oluşturduğunuzda veya çalışma zamanında kendi özelliklerini belirtebilir. Ayrıca, herhangi bir nesne, ikinci nesnenin ilk nesnenin özelliklerini paylaşmasına izin vererek başka bir nesnenin prototipi olarak ilişkilendirilebilir.

Bir nesne kümesi için prototip olarak kullanılan bir nesneye özellik eklerseniz, bunun prototip olduğu nesneler de yeni özelliği alır.

Bu, prototip tabanlı bir dilin sınıf tabanlı olanlara göre temel avantajlarından biridir.

Ayrıca, gerekirse JS ile klasik bir OO mirası almak kolaydır, ancak varsayılan olarak uygulamayan bir dil için bir prototip modeli almak genellikle zordur.


3
Tabanlı veya prototip tabanlı diller için +1 + makale
adivasile
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.